我在EasyMock 2.5.2和JUnit 4.8.2(通过Eclipse运行)中遇到问题。我在这里阅读了所有类似的帖子,但没有找到答案。我有一个包含两个测试相同方法的测试的类。我正在使用匹配器。

  • 单独运行时,每个测试都会通过。
  • 第一个测试始终通过-如果切换文件中测试的顺序,则为true。

  • 这是测试代码的简化版本:
    private Xthing mockXthing;
    private MainThing mainThing;
    
    @Before
    public void setUp() {
        mockXthing = EasyMock.createMock(Xthing.class);
        mainThing = new MainThing();
        mainThing.setxThing(mockXthing);
    }
    
    @After
    public void cleanUp() {
        EasyMock.reset(mockXthing);
    }
    
    @Test
    public void testTwo() {
        String abc = "abc";
        EasyMock.expect(mockXthing.doXthing((String) EasyMock.anyObject())).andReturn(abc);
        EasyMock.replay(mockXthing);
        String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject());
        assertEquals("abc", testResult);
        EasyMock.verify(mockXthing);
    }
    
    @Test
    public void testOne() {
        String xyz = "xyz";
        EasyMock.expect(mockXthing.doXthing((String) EasyMock.anyObject())).andReturn(xyz);
        EasyMock.replay(mockXthing);
        String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject());
        assertEquals("xyz", testResult);
        EasyMock.verify(mockXthing);
    }
    

    第二次(或最后一次)测试始终失败,并出现以下错误:
    java.lang.IllegalStateException: 1 matchers expected, 2 recorded
    

    任何对此的见解将不胜感激。

    谢谢,
    安妮

    最佳答案

    我还没有仔细地仔细观察,但这看起来很可疑:

    String testResult = mainThing.testCallingXthing((Long) EasyMock.anyObject());
    
    anyObject()是一个匹配项,您需要在重播后调用它。它不用于产生任何对象。它用于指示EasyMock允许任何对象。 EasyMock正在检测该额外的匹配器,但是直到第二次测试它才是有害的。那时,EasyMock已记录但尚未使用的匹配器数(2)与第二个doXthing调用的预期参数数(1)不一致。

    您应该将实际参数传递给testCallingXthing(或处于重播模式的模拟)。尝试直接传递null或诸如2的真实值。

    07-24 09:38
    查看更多