【问题标题】:How to test the argument passed in the object creation by new operator如何测试 new 运算符在对象创建中传递的参数
【发布时间】:2015-11-19 18:12:57
【问题描述】:

我想测试构造函数中传入的参数,例如:

class A {
  public void function (String arg1, String arg2) {
    C c = new C(arg1, arg2);
    //....
  }
}

在此,我想测试在创建类C 的对象时传递的arg1 值。有没有办法在不使用 PowerMock 的情况下做到这一点?

【问题讨论】:

  • “测试”是什么意思?你的意思是“验证”吗?如果是这样,那与“模拟”有什么关系?
  • 您可以说它是验证,但基本上我需要编写 Junit 测试用例来检查该参数。所以,我在想一种方法来模拟对象的创建并使用 argumentCaptor 来获取参数。
  • 不关注。 JUnit 用于执行您的代码并检查正确性,即“如果我使用 this 调用,请确保结果/效果是 that”。 编写测试用例,例如new A().function("abc", "xyz") 并验证它是否具有预期的效果。
  • 为什么要这样做而不是重新设计您的代码以使其更具可测试性,例如通过注入CFactory 之类的?
  • 感谢您的建议。我想我会重新设计它以利用工厂模式。

标签: java unit-testing testing junit mocking


【解决方案1】:

本质上,没有一些类的模拟框架,除非你要么返回新对象的结果(在这里或在工厂中),或者将它存储在一个字段中以供以后参考,您不能直接测试这些值是否传递给该构造函数。如果有什么东西间接使用了那个实例,你就有机会在那里对其进行测试,但这会大大削弱测试的意义。

话虽如此,这是一个非常奇怪的用例。如果您要新建一个对象而不用它做任何事情,那么首先创建新实例有什么意义?当坐下来编写这样的测试时,应该对这段特定代码的设计和代码流程提出质疑。

如果您真的想保留它,请将它的创建移到它自己的函数中,在那里您可以独立测试它。您实际上是在创建一个工厂,允许您在任何需要的地方提供 C 的新实例。

【讨论】:

  • 我实际上很想重新设计它,因为这是客户要求的,但我想我没有选择。感谢您的建议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
相关资源
最近更新 更多