Java MeanBean EqualMethodTester和HashCodeMethodTester的自定义属性工厂
是否可以配置自定义工厂为Java MeanBean EqualMethodTester和HashCodeMethodTester的自定义属性工厂,java,unit-testing,equals,Java,Unit Testing,Equals,是否可以配置自定义工厂为org.meanbean.test中的equalMethodTester和HashCodeMethodTester类生成值?当我将适用于BeanTester的配置传递给EqualMethodTester时,我在错误回溯中得到以下消息: org.meanbean.factories.ObjectCreationException:未能为属性[demoUrl]创建值。 未能为类型为[class java.net.URL]的属性=[demoUrl]找到合适的工厂。请注册一家定制
org.meanbean.test
中的equalMethodTester
和HashCodeMethodTester
类生成值?当我将适用于BeanTester
的配置传递给EqualMethodTester
时,我在错误回溯中得到以下消息:
org.meanbean.factories.ObjectCreationException:未能为属性[demoUrl]创建值。
未能为类型为[class java.net.URL]的属性=[demoUrl]找到合适的工厂。请注册一家定制工厂。
org.meanbean.factories.ObjectCreationException:未能实例化[java.net.URL]类型的对象,原因是NoSuchMethodException。
java.lang.NoSuchMethodException:java.net.URL。(
(无论是equalMethodTester
还是HashCodeMethodTester
都会出现此错误。为equalMethodTester().TestequalMethod()
将“demoUrl”添加到insignificantProperties
的insignificantProperties
列表中没有区别。单步执行代码意味着我的URLFactory.create()根本不被调用。)
我看不到将配置传递到HashCodeMethodTester
的任何选项。我浏览了以下站点的文档,但未找到解决方案,也未确认缺失的功能:
(我使用的是MeanBeanv2.0.3和Java1.8。)
我使用java.net.URL
创建了以下类:
public class Product {
private String name;
private URL demoUrl;
public Product(){
super();
}
public int hashCode() {
return Objects.hash(getName(), whitehawkSKU);
}
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (obj == this) {
return true;
}
if (obj.getClass() != getClass()) {
return false;
}
Product other = (Product) obj;
return Objects.equals(getName(), other.getName());
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public URL getDemoUrl() {
return demoUrl;
}
public void setDemoUrl(URL demoUrl) {
this.demoUrl = demoUrl;
}
}
为了处理URL字段,我按照创建了一个自定义工厂,它适用于BeanTester
,但不适用于EqualMethodTester
:
import org.meanbean.lang.Factory;
import java.net.MalformedURLException;
import java.net.URL;
public class URLFactory implements Factory<URL> {
private static int counter = 0;
@Override
public URL create() {
String host = "http://test." + counter + ".url/";
try {
return new URL(host);
}
catch (MalformedURLException except) {
return null;
}
}
}
我缺少什么?在这种情况下,
equalMethodTester().testequalMethod()
需要一个等价的工厂,因为使用java.net.URL
时没有提供默认的空构造函数。因此,当为java.net.URL
调用BasicNewObjectInstanceFactory.create()
时,调用clazz.getDeclaredConstructor()
抛出异常方法抛出“java.lang.NoSuchMethodException”异常。
。
基本上,您只需要实现一个等效工厂。
匿名实现可以是:
private EquivalentFactory productEquivalentFactory=new EquivalentFactory(){
@凌驾
公共产品创建(){
产品p=新产品();
试一试{
p、 setDemoUrl(新URL(“http://test.1.url/"));
}捕获(格式错误){
e、 printStackTrace();
}
p、 设置名称(“测试”);
返回p;
}
};
它必须与您已有的自定义配置一起使用:
new EqualMethodTester().testEqualsMethod(productEquivalentFactory,configureMeanBeanTests(),“demoUrl”)`
对于hashcode,只需使用等效的工厂,它就完成了工作
我测试了它,它正在工作
private Configuration configureMeanBeanTests() {
URLFactory urlFactory = new URLFactory();
return new ConfigurationBuilder()
.overrideFactory("demoUrl", urlFactory).build();
}
@Test
public void testAccessors() {
new BeanTester().testBean(Product.class, configureMeanBeanTests());
}
@Test
public void testEquals() {
new EqualsMethodTester().testEqualsMethod(
Product.class,
configureMeanBeanTests(),
"name",
"demoUrl"
);
}
@Test
public void testHashCode() {
new HashCodeMethodTester().testHashCodeMethod(Product.class);
}