java 7 中的间谍单元测试 @Asynchronous 方法
Unit testing @Asynchronous method in a spy in java 7
我正在尝试测试一些糟糕的遗留代码 (Java 7)
我需要监视无状态服务,但调用异步方法
我收到错误
Object does not represent an actual Future
我应该如何尝试和测试它?
@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);
}
}
}
也许你需要 mockito 的静态方法 when() ,试试吧
doReturn({Future subclass instance}).when({reference spyImporter}).get(anyInt(),xx)
除了 SUT 本身,您不应该在测试中窥探任何其他东西。
OrderDataImport
是一个您应该旨在模拟而不是间谍的依赖项。
您还应该仅在 SUT 上使用 @InjectMocks
:
@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();
}
最后,我看你在这里真的不需要任何间谍活动。
我正在尝试测试一些糟糕的遗留代码 (Java 7)
我需要监视无状态服务,但调用异步方法
我收到错误
Object does not represent an actual Future
我应该如何尝试和测试它?
@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);
}
}
}
也许你需要 mockito 的静态方法 when() ,试试吧
doReturn({Future subclass instance}).when({reference spyImporter}).get(anyInt(),xx)
除了 SUT 本身,您不应该在测试中窥探任何其他东西。
OrderDataImport
是一个您应该旨在模拟而不是间谍的依赖项。
您还应该仅在 SUT 上使用 @InjectMocks
:
@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();
}
最后,我看你在这里真的不需要任何间谍活动。