有一个abstract
类
public abstract class BaseProcessor {
public BooksTransaction getBooksTransaction() {
return booksTransaction;
}
}
还有另外一个final class
将使用 Junit
public final class CreateOrganisationProcessor extends BaseProcessor {
public boolean process() throws Exception { //method to be tested
request = new CreateOrganisationRequest(IntegrationSystems.valueOf(getBooksTransaction().getSource()),
IntegrationSystems.valueOf(getBooksTransaction().getDestination()), getBooksTransaction());
request.setRequestTypes(getRequestTypes());
return true;
}
}
我尝试了间谍 BaseProcessor
类和嘲笑 getBooksTransaction
方法来return BooksTransaction
对象。
代码:
@Test
public void testProcess() throws Exception {
BaseProcessor spy = Mockito.spy(new CreateOrganisationProcessor());
BooksTransaction booksTransaction = new BooksTransaction();
booksTransaction.setReferenceID(DEFAULT_REFERENCE_ID);
Mockito.doReturn(booksTransaction).when(spy).getBooksTransaction();
}
在这里,BooksTransaction
是JPA Entity
类。
但是,当我运行测试用例时,该模拟似乎不起作用,它没有返回BooksTransaction
对象。
它既不会抛出exception
,也不会抛出任何error
。
我想知道使用spy
的正确方法,以便按照我的BooksTransaction
返回mock
的对象。
我是Mockito
的新手,任何帮助都是不小的。
提前致谢。
答案 0 :(得分:1)
有趣的是,您为一个甚至没有开始编译的问题获得了5票赞成票...我将其简化了一点,以便我可以实际上对其进行编译,因为我不知道您的结构,甚至无法正确猜测。
但是首先要注意的是Mockito
默认情况下不能 模拟final
类;您的问题下方有一条评论,显示了如何启用它。
@Getter
static abstract class BaseProcessor {
private BooksTransaction BooksTransaction;
}
@Getter
static class CreateOrganisationProcessor extends BaseProcessor {
CreateOrganisationRequest request;
public boolean process() { //method to be tested
request = new CreateOrganisationRequest(getBooksTransaction());
return true;
}
public CreateOrganisationRequest getRequest() {
return request;
}
}
@RequiredArgsConstructor
@Getter
static class BooksTransaction {
private final String testMe;
}
@Getter
@RequiredArgsConstructor
static class CreateOrganisationRequest {
private final BooksTransaction booksTransaction;
}
这是起作用的测试:
@Test
public void test() {
CreateOrganisationProcessor org = new CreateOrganisationProcessor();
CreateOrganisationProcessor spy = Mockito.spy(org);
System.out.println(spy);
BooksTransaction booksTransaction = new BooksTransaction("go!");
Mockito.doReturn(booksTransaction).when(spy).getBooksTransaction();
spy.process();
BooksTransaction mocked = spy.getRequest().getBooksTransaction();
Assert.assertEquals(mocked.getTestMe(), "go!");
}
现在考虑一下,您在评论中说://method to be tested
,但您甚至没有在测试中称呼它,听起来可疑吗?虽然CreateOrganisationProcessor
中没有定义该方法,但是您将间谍分配给了:
BaseProcessor spy = Mockito.spy(new CreateOrganisationProcessor());
因此,现在您甚至无法在该process
引用上调用spy
,因为在BaseProcessor
中定义了 not 。