首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当与夸克一起运行时,均衡器失败:

当与夸克一起运行时,均衡器失败:
EN

Stack Overflow用户
提问于 2021-11-26 11:18:59
回答 1查看 381关注 0票数 2

在夸克开发模式下运行均衡器时,均衡器测试失败。

我试着用均衡器测试一个类。这在我的IDE中是可行的。我尝试在quarkus dev模式下使用它(通过运行./mvnw quarkus:dev),但是随后它失败了,只有以下例外:

代码语言:javascript
复制
ERROR [io.qua.test] (Test runner thread) Test DingetjeTest#implementsEquals() failed 
: java.lang.AssertionError: EqualsVerifier found a problem in class a.Dingetje.
-> Can not set final java.lang.String field a.Dingetje.text to a.Dingetje

For more information, go to: http://www.jqno.nl/equalsverifier/errormessages
        at nl.jqno.equalsverifier.api.SingleTypeEqualsVerifierApi.verify(SingleTypeEqualsVerifierApi.java:308)
        at a.DingetjeTest.implementsEquals(DingetjeTest.java:11)
Caused by: java.lang.IllegalArgumentException: Can not set final java.lang.String field a.Dingetje.text to a.Dingetje
        at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
        at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
        at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58)
        at java.base/jdk.internal.reflect.UnsafeQualifiedObjectFieldAccessorImpl.get(UnsafeQualifiedObjectFieldAccessorImpl.java:38)
        at java.base/java.lang.reflect.Field.get(Field.java:418)
        at nl.jqno.equalsverifier.internal.reflection.FieldModifier.lambda$copyTo$1(FieldModifier.java:79)
        at nl.jqno.equalsverifier.internal.reflection.FieldModifier.lambda$change$3(FieldModifier.java:113)
        at nl.jqno.equalsverifier.internal.util.Rethrow.lambda$rethrow$0(Rethrow.java:47)
        at nl.jqno.equalsverifier.internal.util.Rethrow.rethrow(Rethrow.java:30)
        at nl.jqno.equalsverifier.internal.util.Rethrow.rethrow(Rethrow.java:45)
        at nl.jqno.equalsverifier.internal.util.Rethrow.rethrow(Rethrow.java:55)
        at nl.jqno.equalsverifier.internal.reflection.FieldModifier.change(FieldModifier.java:113)
        at nl.jqno.equalsverifier.internal.reflection.FieldModifier.copyTo(FieldModifier.java:79)
        at nl.jqno.equalsverifier.internal.reflection.InPlaceObjectAccessor.copyInto(InPlaceObjectAccessor.java:43)
        at nl.jqno.equalsverifier.internal.reflection.InPlaceObjectAccessor.copy(InPlaceObjectAccessor.java:24)
        at nl.jqno.equalsverifier.internal.checkers.ExamplesChecker.checkSingle(ExamplesChecker.java:84)
        at nl.jqno.equalsverifier.internal.checkers.ExamplesChecker.check(ExamplesChecker.java:47)
        at nl.jqno.equalsverifier.api.SingleTypeEqualsVerifierApi.verifyWithExamples(SingleTypeEqualsVerifierApi.java:413)
        at nl.jqno.equalsverifier.api.SingleTypeEqualsVerifierApi.performVerification(SingleTypeEqualsVerifierApi.java:369)
        at nl.jqno.equalsverifier.api.SingleTypeEqualsVerifierApi.verify(SingleTypeEqualsVerifierApi.java:304)
        ... 1 more

下面是正在测试的课程:

代码语言:javascript
复制
package a;

import java.util.Objects;

public class Dingetje {
    private final String text;

    public Dingetje(String text) {
        this.text = text;
    }

    @Override
    public final boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Dingetje)) {
            return false;
        }
        Dingetje other = (Dingetje) o;
        return text.equals(other.text);
    }

    @Override
    public final int hashCode() {
        return Objects.hash(text);
    }
}

而测试:

代码语言:javascript
复制
package a;

import nl.jqno.equalsverifier.EqualsVerifier;
import org.junit.jupiter.api.Test;

class DingetjeTest {
    @Test
    void implementsEquals() {
        EqualsVerifier.forClass(Dingetje.class)
                .withNonnullFields("text")
                .verify();
    }
}

我在这里错过了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-03 15:31:21

EqualsVerifier使用产科来创建类的实例,并且出于性能原因,它保持与objenesis对象相同的引用。它缓存它以前创建的所有对象,这样当您想要一次又一次地创建相同的对象时,这会使事情变得更快,而EqualsVerifier往往会这样做。

但是,EqualsVerifier保留了对objenesis的静态引用,这意味着它的寿命与JVM一样长。事实证明,Quarkus测试运行程序可以一次又一次地重新运行相同的测试,并且每次都会创建一个新的类加载器。但是java.lang.Class平等的一部分是创建类的类加载器也必须是相同的。因此,它无法再从缓存中检索这些对象,并使用与测试中创建的其他对象不同的类加载器返回实例,这导致了您看到的异常。

在EqualsVerifier的3.8版中(作为StackOverflow post的结果创建),可以通过添加如下所示的#withResetCaches()来避免此问题:

代码语言:javascript
复制
EqualsVerifier.forClass(Dingetje.class)
    .withResetCaches()
    .withNonnullFields("text")
    .verify();

这解决了问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70123578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档