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

标签 java unit-testing mockito junit4 spy

有一个抽象

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/

相关文章:

Python:如何为单元测试模拟kafka主题?

java - 为什么执行 Mockito 模拟的性能如此不稳定?

java - MySQL:创建触发器总是给我语法错误

java - 具有继承映射的一对多 JPA 映射

java - mockito @Mock 没有按预期注入(inject)命名的@Resource

java - Mockito 基于字符串参数的模拟响应

java - 使用 File 和 FileInputStream 与 Mockito/PowerMockito 测试类

java - 如何从 Netbeans 运行 Selenium 测试

java - 使用 Guice 进行模拟并拥有用于测试目的的真实对象

python - 如何在单个 Python 单元测试中处理多个断言?