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

时间:2015-04-16 10:52:52

标签: java oop junit

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

public class Foo {
      public Bar createBarOf(String argumentOne, String argumentTwo) {
             String argumentForBar = argumentOne + argumentTwo;
             return new Bar(argumentForBar);
      }
}

有什么建议吗?

修改

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

    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的存储字段,而是变量来计算对象中字段的值。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

assertThat(actualbar).isEqualTo(expectedBar)

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

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

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