Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MeanBean EqualMethodTester和HashCodeMethodTester的自定义属性工厂_Java_Unit Testing_Equals - Fatal编程技术网

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);
}