关于java:如何测试工厂方法传递给构造函数的参数?

How to test arguments passed to constructor on a factory method?

我遇到了一个我真不知道如何解决的情况。我刚刚创建了一个类Foo,它包含一个静态工厂方法,使用一些参数创建类Bar,因此Foo是一种工厂类。现在我想测试这个方法,但问题是,这些参数在内部被修改,以创建在Bar上调用构造函数所需的变量。作为测试的一部分,我可以测试我得到Bar的最终对象,但我不知道如何验证传递给构造函数的参数。

1
2
3
4
5
6
public class Foo {
      public Bar createBarOf(String argumentOne, String argumentTwo) {
             String argumentForBar = argumentOne + argumentTwo;
             return new Bar(argumentForBar);
      }
}

有什么建议?

编辑

为了使问题更清楚,这是Bar类。

1
2
3
4
5
6
7
8
    public class Bar {
          private final String SUFFIX ="BarSuffix";
          private String field;

          public Bar(String argumentForBar) {
                field = argumentForBar + BAR_SUFFIX;
          }
    }

所以,考虑到这个构造函数。当我在Foo中测试createBarFor(argumentOne,argumentTwo)时,我无法弄清楚如何测试那个argumentOne和argumentTwo用于创建Bar,除非我还在该测试中测试Bar构造函数并假设Bar的内部是什么。 argumentOne和argumentTwo不是Bar的存储字段,而是变量来计算对象中字段的值。


只需使用createBarOf并对返回的Bar对象断言您的期望。 当你使用参数ab创建ab时,你不应该试图断言ab被传递给构造函数,当你获得Bar对象时,它已经被包含了。

由于createBarOf内没有退出逻辑(从方法返回的执行分支),因此您不必专门测试有关此方法的任何内容。


我有类似的情况。 如果您的Bar有一个equals方法,您可以随时构建您希望工厂在测试中构建的Bar ...

1
assertThat(actualbar).isEqualTo(expectedBar)

但是如果没有任何意义可以拥有"等于",或者你不能因为某种原因改变"Bar",那么你可能没有太多选择,只能通过反射进入Bar的私人领域,看看是否 设置正确的值。

例如(这使用名为ReflectionTestUtils的"spring-test"类)...

1
assertThat(ReflectionTestUtils.getField(actualBar,"argumentForBar")).isEqualTo(expectedValue);