【问题标题】:Assertion error expectation failure EasyMock断言错误预期失败 EasyMock
【发布时间】:2016-05-31 19:14:09
【问题描述】:

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

    @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();        
    }

【问题讨论】:

    标签: junit mocking easymock


    【解决方案1】:

    你有两个端口对象真的很令人困惑。创建一个模拟的 drPort 是什么感觉?当你给你的被测类一个“真正的”端口对象时?

    您会看到:您要么创建一个模拟并将其传递给您的测试代码(然后您必须为预期的行为设置模拟;您可以随后验证);或者您只为您的被测代码提供“真实”对象,但是您通常会对“被测代码”的调用结果进行某种断言。

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

    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)
    

    含义:任何“对象”

    a) 你的“被测类”需要完成它的工作 b) 你想要/必须以某种方式“控制”

    需要被嘲笑;包括所有预期方法调用的“规范”。

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

    【讨论】:

      猜你喜欢
      • 2012-08-29
      • 2012-11-28
      • 2022-12-03
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多