如何在要测试的类中模拟抽象类方法



有一个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类并模拟getBooksTransactionreturn 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此方法的正确方法,以便它根据我的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!");
}

现在想想,你在评论中说://method to be tested但你甚至没有在你的测试中调用它,听起来很可疑,不是吗?比该方法在CreateOrganisationProcessor中定义,但您将间谍分配给:

BaseProcessor spy = Mockito.spy(new CreateOrganisationProcessor());

所以现在你甚至不能再在这个spy引用上调用process,因为它没有BaseProcessor中定义。

最新更新