Java 如何在工厂方法上测试传递给构造函数的参数?
我遇到了一个我真的不知道如何解决的情况。我刚刚创建了一个类Foo,它包含一个静态工厂方法,使用一些参数创建类Bar,所以Foo有点像工厂类。现在我想测试这个方法,但问题是,这些参数在内部被修改,以创建在Bar上调用构造函数所需的变量。作为测试的一部分,我可以测试我是否得到Bar的最终对象,但我不知道如何验证传递给构造函数的参数Java 如何在工厂方法上测试传递给构造函数的参数?,java,oop,junit,Java,Oop,Junit,我遇到了一个我真的不知道如何解决的情况。我刚刚创建了一个类Foo,它包含一个静态工厂方法,使用一些参数创建类Bar,所以Foo有点像工厂类。现在我想测试这个方法,但问题是,这些参数在内部被修改,以创建在Bar上调用构造函数所需的变量。作为测试的一部分,我可以测试我是否得到Bar的最终对象,但我不知道如何验证传递给构造函数的参数 public class Foo { public Bar createBarOf(String argumentOne, String argumentTw
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的存储字段,而是用于计算对象中字段值的变量 只需使用
createBarOf
并针对返回的条
对象声明您的期望。当您使用参数a
和b
创建构造函数时,不应试图断言ab
已传递给构造函数,当您获得条
对象时,这些参数已包含在构造函数中
由于
createBarOf
中没有退出逻辑(从方法返回的执行分支),因此不必专门测试此方法的任何内容。我也遇到过类似的情况。如果你的Bar有一个equals方法,你总是可以构建你期望工厂在你的测试中构建的Bar,然后
assertThat(actualbar).isEqualTo(expectedBar)
但是,如果使用“equals”没有任何意义,或者您无法出于任何原因更改“Bar”,那么除了使用反射查看Bar的私有字段以查看是否设置了正确的值之外,您可能别无选择
例如(这使用了一个名为ReflectionTestUtils的“spring测试”类)
但我不应该在Bar类的特定单元测试中测试我的期望吗?作为Foo测试的一部分,测试Bar将使Bar的单元测试变得多余(至少对其构造函数是这样)。我可以在这里测试工厂方法和Bar构造函数,但是Bar的单元测试不包括对其构造函数的测试,这看起来很奇怪。仅仅测试我从工厂方法中获得了一个Bar类型的对象并不能确保为构造函数创建参数的逻辑(实际代码比concat两个字符串复杂一点)@Kilian:我不是说你测试你收到了一个Bar对象。我的意思是对返回的Bar对象执行断言;这个论点有什么影响?它会改变一些变量吗?然后在
Bar.getArgument()
上断言。你的单元测试可以包含多层单元:看看我的答案。我的问题是,传递的参数从未存储在Bar对象中。它在构造函数中用于填充其他对象的列表。这就是我的问题,这里没有Bar.getArgumentForBar()
,而是Bar.getNewCalculatedValue()
。如果我想验证Foo factory方法是否使用传递的参数,除非有办法在单元测试中捕获这些参数,否则我还必须在Bar中测试构造函数逻辑,我希望在特定于它的单元测试中这样做。对,但您仍然没有展示它的使用方式。只需测试最终使用字段的代码,看看是否运行良好。它隐式地测试它。好的,那么您是说测试工厂方法的唯一方法是在应用构造函数中的逻辑后验证字段
是否包含预期的数据。我之所以问这个问题,是因为在我看来,字段的使用方式或包含的内容都不重要。测试应该只验证用于计算构造函数参数的逻辑,而不是构造函数本身。这应该是Bar单元测试的一部分,而不是Foo单元测试的一部分。但是如果没有办法做到这一点,那么我应该获取字段
并断言它,这样构造函数也在这里进行测试是有意义的。正如前面的回复中所评论的,在特定的Bar单元测试中测试构造函数对我来说更有意义,而不是将其作为Foo中工厂测试方法的一部分。对我来说,这里应该测试的是为Bar构造函数创建最终参数的逻辑,而不是构造函数的工作方式(这应该是另一个测试)。但是如果没有其他方法,我想我将不得不测试在这里调用构造函数的结果。
assertThat(ReflectionTestUtils.getField(actualBar, "argumentForBar")).isEqualTo(expectedValue);