2016-05-31 95 views
0

我有下一个JUnit测试,它工作正常,但最后在验证它抛出期望失败。我认为这是因为嘲笑PsPort是我发送给DataReaderPsPort的不同。 有没有其他的方法来测试它?断言错误期望失败EasyMock

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

回答

0

令人困惑的是,您有两个端口对象。创建一个模拟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) 

含义:任何“对象”是

一)你的“测试类”需要做的工作 B)你想/有以某种方式“控制”

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

然后你提供嘲讽的东西给你的测试代码;执行你想测试的方法......最后验证模拟是否看到了你为它指定的行为。