有一个抽象
类
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
方法以返回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
对象。
它既不会抛出异常
,也不会抛出任何错误
。
我想知道 spy
这个方法的正确方法,以便它根据我的 mock
返回一个 BooksTransaction
的对象。
我是 Mockito
的新手,任何帮助都将不胜感激。
提前致谢。
最佳答案
有趣的是,对于一个甚至一开始都无法编译的问题,您获得了 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!");
}
现在想一想,您在评论中说://要测试的方法
但您甚至没有在测试中调用它,听起来很可疑,不是吗?该方法在 CreateOrganisationProcessor
中定义,但您将 spy 分配给:
BaseProcessor spy = Mockito.spy(new CreateOrganisationProcessor());
所以现在您甚至不能再对那个spy
引用调用process
,因为它没有在BaseProcessor< 中定义
。
关于java - 如何在要测试的类中模拟抽象类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57693345/