我遇到了一个我真不知道如何解决的情况。我刚刚创建了一个类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的存储字段,而是变量来计算对象中字段的值。
答案 0 :(得分:2)
只需使用createBarOf
并对返回的Bar
对象断言您的期望。您不应该尝试断言ab
在使用参数a
和b
创建时传递给构造函数,当您获得Bar
对象时已经包含createBarOf
由于{{1}}内没有退出逻辑(从方法返回的执行分支),因此您不必专门测试有关此方法的任何内容。
答案 1 :(得分:0)
我遇到过类似的情况。如果您的Bar有一个equals方法,您可以随时构建您希望工厂在测试中构建的Bar ...
assertThat(actualbar).isEqualTo(expectedBar)
但是如果没有任何意义可以拥有“等于”,或者你因为某种原因无法改变“Bar”,那么你可能没有太多选择,只能通过反射来到Bar的私人领域。看看是否设置了正确的值。
例如(这使用名为ReflectionTestUtils的“spring-test”类)...
assertThat(ReflectionTestUtils.getField(actualBar, "argumentForBar")).isEqualTo(expectedValue);