代码之家  ›  专栏  ›  技术社区  ›  Jim

java 7中spy中的异步方法单元测试

  •  0
  • Jim  · 技术社区  · 7 年前

    我试图测试一些糟糕的遗留代码(Java7)
    我需要监视无状态服务,但调用异步方法

    我得到了错误

    我应该如何尝试和测试这一点?

    @InjectMocks
    private OrderDataImport spyImporter;
    
    /* has spyImporter as a dependency */
    @InjectMocks
    private ImportService sut; /* system under test */
    
    @Before
    public void setUp() {
        // create spy
        spyImporter = Mockito.spy(new OrderDataImport());
        MockitoAnnotations.initMocks(this);
    }
    
    @Test
    public Test() {
       sut.import();
    }
    

    导入代码

    class ImportService {
       @EJB
       private OrderDataImport dependency;
    
    
       public boolean import() {
           List<Future<Result>> resultList = new ArrayList<>();
    
           int THREAD_COUNT = 3;
           while (THREAD_COUNT-- > 0)
               resultList.add(dependency.create(...));
    
           for (int i = 0; i < resultList.size(); i++) {
               /* Object does not represent an actual Future */
               Result result = resultList.get(i).get(60, TimeUnit.MINUTES);
           }           
       }
    }
    
    2 回复  |  直到 7 年前
        1
  •  0
  •   winters    7 年前

    也许你需要mockito的静态方法when(),试试吧

    doReturn({Future subclass instance}).when({reference spyImporter}).get(anyInt(),xx)

        2
  •  0
  •   Maciej Kowalski    7 年前

    您不应该在测试中监视SUT本身以外的任何东西。

    OrderDataImport 是一种依赖关系,您应该以模仿而不是间谍为目标。

    @InjectMocks 仅在SUT上:

    @Mock
    private OrderDataImport importerStub;
    
    @InjectMocks
    private ImportService sut; 
    
    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }
    
    @Test
    public Test() {
       // Arrange
       when(importerStub.create(..)).thenReturn(/* Future instance */);
    
       // Act
       sut.import();
    }