我有一个要为其编写JUnit测试的类。我正在尝试测试是否从未调用过特定方法。

public class CountryProcess extends AbstractCountryProcess {

    private static final Logger log = LoggerFactory.getLogger(CountryProcessor.class);
    private static final Long MAX_FILE = 20l;

    @Override
    protected boolean processCountry(Region region, City city) {
        Long maxFile = region.getRequiredLongValue(SIZE);

        if (maxFile < MAX_FILE) {
            cntDao.addCountryLandMark(city);
        }
        else {
            log.warn("File size was big");
        }

        return true;
}


测试类是:

public class CountryProcessTest {

    @Rule
    public final JUnitRuleMockery context = new JUnitRuleMockery();
    private final CntDao cntDao = context.mock(CntDao.class);

    @Before
    public void setup() {
        Injector injector = Guice.createInjector(new AbstractModule() {
            @Override
            protected void configure() {
                bind(cntDao.class).toInstance(cntDao);
            }
        });
    }

    @Test
    public void shouldIgnoreIfFileSizeBiggerThanPermitted() {
        //some code to make it trigger ELSE statement above...
        verify(cntDao, never()).addCountryLandMark(anyString());
    }
}


但这将返回以下错误:


  org.mockito.exceptions.misusing.NotAMockException:
  
  传递给verify()的参数是$ Proxy4类型的,不是模拟的!
  
  确保正确放置括号!
  
  请参阅正确验证的示例:
  
  verify(mock).someMethod();
  
  verify(mock,times(10))。someMethod();
  
  verify(mock,atLeastOnce())。someMethod();


知道如何在当前情况下解决此问题。请举一个使用当前代码的示例,这样我有一个更好的主意?

最佳答案

您正在混合两个模拟框架:


jMock-JUnitRuleMockery
Mockito-verify方法


显然,它们彼此不兼容。
您的验证调用看起来还不错,我相信它会在收到使用Mockito创建的模拟文件后立即运行(使用Mockito.mock(CntDao.class)

作为never的替代方法,可以使用Mockito.verifyNoMoreInteractionsMockito.verifyZeroInteractions,但是它们的含义不太明确。

09-10 09:15
查看更多