如何测试在工厂方法上传递给构造函数的参数?
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
对象声明您的期望。当你使用参数 a
和 b
创建它时,你不应该试图断言 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);
我遇到了一个我真的不知道如何解决的情况。我刚刚创建了一个 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
对象声明您的期望。当你使用参数 a
和 b
创建它时,你不应该试图断言 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);