java - 我应该在测试中的实际类里面重复代码吗

标签 java unit-testing

我想测试特定方法是否会产生预期结果,但要做到这一点,我还需要操作测试中的输入。

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/

相关文章:

python - 如何通过传递命令行参数测试__name__ == "__main__"?

python - 以错误警告运行 nosetests?

java - 通过套接字同时发送和接收数据

java - 有没有办法阻止来自 Java JUnit 测试的所有外部网络访问?

java - 跨两个文件双向解析属性

java - ElasticSearch 事件监听器

node.js - 使用 chai-http 和 Jest 进行测试时,如何从 api 返回响应

c# - 如何使用 NUnit 测试回调

java.lang.NoClassDefFoundError : bsh/EvalError 错误

java - OnTouchListener 没有响应