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

时间:2019-08-28 13:15:44

标签: java unit-testing mockito junit4 spy

有一个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();
}

在这里,BooksTransactionJPA Entity类。

但是,当我运行测试用例时,该模拟似乎不起作用,它没有返回BooksTransaction对象。 它既不会抛出exception,也不会抛出任何error

我想知道使用spy的正确方法,以便按照我的BooksTransaction返回mock的对象。

我是Mockito的新手,任何帮助都是不小的。 提前致谢。

1 个答案:

答案 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