EasyMock 断言错误期望失败
Assertion error expectation failure EasyMock
我有下一个 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();
}
你有两个端口对象真是令人困惑。创建一个模拟的 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"。
然后将模拟的东西提供给被测代码;执行您要测试的方法...以最终验证模拟是否看到了您为其指定的行为。
我有下一个 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();
}
你有两个端口对象真是令人困惑。创建一个模拟的 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"。
然后将模拟的东西提供给被测代码;执行您要测试的方法...以最终验证模拟是否看到了您为其指定的行为。