java中模拟密码时出错
为了进行测试,我模拟了一个密码对象,但是当我运行测试时,它失败了,因为它运行的是密码而不是模拟 所以,我编写了一个非常简单的测试,当我运行它时,总是失败 我的测试代码是:java中模拟密码时出错,java,unit-testing,encryption,junit,Java,Unit Testing,Encryption,Junit,为了进行测试,我模拟了一个密码对象,但是当我运行测试时,它失败了,因为它运行的是密码而不是模拟 所以,我编写了一个非常简单的测试,当我运行它时,总是失败 我的测试代码是: import javax.crypto.Cipher; import org.junit.Test; import org.mockito.Mockito; public class SimpleTest { @Test public void simpleTest() throws Exception {
import javax.crypto.Cipher;
import org.junit.Test;
import org.mockito.Mockito;
public class SimpleTest {
@Test
public void simpleTest() throws Exception {
Cipher cipher = Mockito.mock(Cipher.class);
cipher.doFinal(null);
assertTrue(true);
}
}
例外情况是谁产生了:
java.lang.IllegalStateException: Cipher not initialized
at javax.crypto.Cipher.checkCipherState(Cipher.java:1750)
at javax.crypto.Cipher.doFinal(Cipher.java:2157)
at SimpleTest.simpleTest(SimpleTest.java:12)
...
为什么要执行doFinal?我很愚蠢
多亏了@JBnizet和@ShmulikKlein,thery是对的
顾名思义,doFinal方法是final方法,不能用Mockito来模仿它
我试着用PowerMokito做这件事,效果很好
import static org.junit.Assert.assertTrue;
import javax.crypto.Cipher;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest(Cipher.class)
public class SimpleTest {
@Test
public void simpleTest() throws Exception {
Cipher cipher = PowerMockito.mock(Cipher.class);
PowerMockito.when(cipher.doFinal(null)).thenReturn(null);
cipher.doFinal(null);
assertTrue(true);
}
}
谢谢 Mockito无法模拟最终方法。doFinal()是final。你不应该模仿密码。你应该模拟你自己使用密码的服务。首先,你没有给模拟对象一个
当(…)然后返回(…)
指令,其次,@JBNizet是对的,你为什么要做这样的事情?相关的测试你的代码。不要测试平台。只需注意:名称doFinal()不是这样命名的,因为它是final。它之所以这样命名是因为它执行最终的加密操作。它是最终的,因为类的设计者不希望该方法被子类重写。但这两者完全无关。不要期望final方法的名字中有final。我仍然不明白这个练习的意义。要么根本不应该测试密码
,要么应该测试自己的密码pi
实现。