EasyMock 断言错误期望失败

Assertion error expectation failure EasyMock

我有下一个 JUnit 测试,它工作正常,但最后在验证中抛出预期失败。我认为这是因为模拟的 PsPort 与我发送给 DataReaderPsPort 不同。 还有其他方法可以测试吗?

    @Test
    public void testguardarMensaje() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, InstantiationException{

        String datoTest = "1=123456";   

        Constructor<PsPort> constructor = PsPort.class.getDeclaredConstructor(new Class[] {String.class});
        constructor.setAccessible(true);
        PsPort port = constructor.newInstance("middleware.conf");

        PsPort drMock;

        int hash1 = datoTest.hashCode();
        String hashString1 = String.valueOf(hash1);
        String combinedIdDataHashString1 = datoTest +"="+ hashString1;

        drMock = strictMock(PsPort.class);
        byte[] datoByte = port.encriptarDesencriptarMensaje(combinedIdDataHashString1.getBytes(), Cipher.ENCRYPT_MODE);
        drMock.guardarDato(datoByte);
        replayAll();

        int hash = datoTest.hashCode();
        String hashString = String.valueOf(hash);
        String combinedIdDataHashString = datoTest +"="+ hashString;

        byte[] datoByte2 = port.encriptarDesencriptarMensaje(combinedIdDataHashString.getBytes(), Cipher.ENCRYPT_MODE);

        DatagramPacket paquete = new DatagramPacket(datoByte2,datoByte2.length);
        paquete.getData();

        DataReader dr = new DataReader(port, null, 100, "=", "C:/Users/Asier/Desktop/logs/");

        dr.guardarMensaje(paquete, port);
        verifyAll();        
    }

你有两个端口对象真是令人困惑。创建一个模拟的 drPort 有什么意义;当您将 "real" 端口对象提供给正在测试的 class 时?

你看:你要么创建一个模拟并将其传递给被测代码(然后你必须为预期的行为设置模拟;之后你可以验证它);或者您只向被测代码提供 "real" 对象,但随后您通常会对 "code under test".

的调用结果进行某种断言

因此,从这个意义上说,您的代码中至少存在一个问题并不重要:

drMock.guardarDato(datoByte);
replayAll();

在drMock的方法调用之后应该调用EasyMock.expectLastCall();但正如所说:一方面,由于并未真正使用模拟对象,所以这并不重要。因为,如果您添加该语句,您的测试将始终失败;因为你未使用的模拟永远不会看到你指定它看到的调用。

为了给大家一些指导;这就是您进行此类测试的一般方式:

SomeClassYouNeed mockedThingy = createStrict/Nice(SomeClassYouNeed.class);
expect(mockedThingy.foo()).andReturn("whatever");
mockedThingy.bar();
expectLastCall();
replay (mockedThingy);

ClassUnderTest underTest = new ClassUnderTest(mockedThingy);
underTest.doSomething();

verify(mockedThingy)

含义:任何 "object"

a) 你的 "class under test" 需要完成它的工作 b) 你以某种方式want/have到"control"

需要被嘲笑;包括所有预期方法调用的 "specification"。

然后将模拟的东西提供给被测代码;执行您要测试的方法...以最终验证模拟是否看到了您为其指定的行为。