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

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

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

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

有什么建议吗?

编辑

为了让问题更清楚,这是酒吧class。

    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 并针对 returned Bar 对象声明您的期望。当你使用参数 ab 创建它时,你不应该试图断言 ab 被传递给构造函数,当你获得 Bar 对象时,它已经包含.

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

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

assertThat(actualbar).isEqualTo(expectedBar)

但是,如果 "equals" 没有任何意义,或者您出于任何原因无法更改 "Bar",那么您可能别无选择,只能进入私有Bar 的字段使用反射来查看是否设置了正确的值。

例如(这使用了一个名为 ReflectionTestUtils 的 "spring-test" class)...

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