MeanBean EqualsMethodTester和HashCodeMethodTester的自定义属性工厂

时间:2017-11-06 19:34:59

标签: java unit-testing equals

是否可以配置自定义工厂以从EqualsMethodTester生成HashCodeMethodTesterorg.meanbean.test类的值?当我将适用于BeanTester的配置传递给EqualsMethodTester时,我在错误回溯中收到以下消息:

org.meanbean.factories.ObjectCreationException:无法为属性[demoUrl]创建值。

无法为type = [class java.net.URL]的property = [demoUrl]找到合适的Factory。请注册一个自定义工厂。

org.meanbean.factories.ObjectCreationException:由于NoSuchMethodException,无法实例化[java.net.URL]类型的对象。

java.lang.NoSuchMethodException:java.net.URL.<init>()

EqualsMethodTesterHashCodeMethodTester都会出现此错误。将“demoUrl”添加到insignificantProperties的{​​{1}}列表中没有任何区别。单步执行代码意味着我的URLFactory根本没有调用.create()。)

我没有看到将配置传递到EqualsMethodTester().testEqualsMethod()的任何选项。我在以下网站上浏览了文档,但没有找到解决方案,也没有找到缺少的功能:http://meanbean.sourceforge.net/docs/2.0.3/public/org/meanbean/test/EqualsMethodTester.html http://meanbean.sourceforge.net/docs/2.0.3/public/org/meanbean/test/HashCodeMethodTester.html http://meanbean.sourceforge.net/docs/2.0.3/public/org/meanbean/test/ConfigurationBuilder.html http://meanbean.sourceforge.net/docs/2.0.3/Mean_Bean_2.0.3_User_Guide.pdf

(我正在使用MeanBean v 2.0.3和Java 1.8。)

我有以下课程,使用HashCodeMethodTester

java.net.URL

为了处理网址字段,我根据meanbean: failed to test bean with arrays创建了一个自定义工厂,它适用于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; } } ,但不适用于BeanTester

EqualsMethodTester

我的测试方法如下:

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

我错过了什么?

1 个答案:

答案 0 :(得分:1)

由于使用EqualsMethodTester().testEqualsMethod()不提供默认的空构造函数,java.net.URL在特定情况下看起来需要EquivalentFactory。因此,当为BasicNewObjectInstanceFactory.create()调用java.net.URL时,调用clazz.getDeclaredConstructor()会抛出异常Method threw 'java.lang.NoSuchMethodException' exception.。 基本上你只需要实现一个EquivalentFactory。 匿名实现可以是: private EquivalentFactory<Product> productEquivalentFactory = new EquivalentFactory<Product>() { @Override public Product create() { Product p = new Product(); try { p.setDemoUrl(new URL("http://test.1.url/")); } catch (MalformedURLException e) { e.printStackTrace(); } p.setName("test"); return p; } }; It has to be used with the custom configuration that you already have: 新的EqualsMethodTester()。testEqualsMethod(productEquivalentFactory,configureMeanBeanTests(),“demoUrl”);`

对于哈希码,只需使用等效的工厂即可完成工作。

我测试了它并且它正在工作。