我想测试特定方法是否会产生预期结果,但要做到这一点,我还需要操作测试中的输入。
class ToTest {
public String produceResponse(String input) {
// ....
encryptedIds = encryptIds(input)
output = doStuff(input, encryptedIds)
}
public encryptIds(input) {
....
}
}
在我的测试中,我需要检查 ProduceResponse 是否确实产生了预期的响应。 为此,我必须对输入中的 id 进行加密。
我的问题是:我应该在测试中重写 encryptIds (以便我对结果有更多的控制权)还是应该从类本身调用 encryptIds 。
有没有更好的方法来解决这个问题?我不喜欢在我的测试中我知道特定流程中会发生什么。
最佳答案
如果我理解正确,您希望使用已知的 cryptoIds 作为输入来测试 productResponse()
。
您可以在不重构代码的情况下做到这一点,但重构它可能是一个好主意,所以这就是我要解释的内容:
class ToTest {
private IdEncryptor encryptor;
public ToTest(IdEncryptor encryptor) {
this.encryptor = encryptor;
}
public String produceResponse(String input) {
String[] encryptedIds = encryptor.encryptIds(input);
return doStuff(input, encryptedIds);
}
}
现在您可以对 IdEncryptor 进行单元测试,以测试它是否根据字符串输入生成正确的加密 ID。
为了测试 ToTest 类,您可以模拟 IdEncryptor,以便无论它接收到什么输入,它都会生成您想要的 cryptoIds。例如使用mockito:
IdEncryptor mockEncryptor = mock(IdEncryptor.class);
when(mockEncryptor.encryptIds(any(String.class)).thenReturn(new String[] {"a", "b"});
ToTest toTest = new ToTest(mockEncryptor);
String response = toTest.produceResponse("input");
// expect that the response is what you expect given "a", "b" as input of doStuff()
关于java - 我应该在测试中的实际类里面重复代码吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29588169/