Java Junit断言错误

Java Junit断言错误,java,gradle,junit,Java,Gradle,Junit,在Java Gradle项目中运行JUnit测试时,我遇到一个断言错误 在本测试中,我将测试以下方法: @Override public Projectile shoot(Point initialPosition, int angle, Player player) { if (!onCoolDown) { if (Config.soundfx) { sound = Gdx.audio.newSound(Gdx.f

在Java Gradle项目中运行JUnit测试时,我遇到一个断言错误

在本测试中,我将测试以下方法:

    @Override
public Projectile shoot(Point initialPosition, int angle, Player player)
{
    if (!onCoolDown)
    {
        if (Config.soundfx)
        {
            sound = Gdx.audio.newSound(Gdx.files.internal("soundEffects/shoot.mp3"));

            Random r = new Random();
            double randomValue = 1.2 + (1.4 - 1.2) * r.nextDouble();
            sound.setPitch(sound.play(1.0f), (float)randomValue);
            //sound.play(1.0f);
        }
        shotsRemaining--;
        onCoolDown = true;
        cooldownTimer.schedule(new TimerTask() {
            @Override
            public void run()
            {
                onCoolDown = false;
            }
        }, cooldown);
        Point aimPoint = new Point();
        aimPoint.x = initialPosition.x + (int) (Math.sin(Math.toRadians(angle)) * 30);
        aimPoint.y = initialPosition.y + (int) (Math.cos(Math.toRadians(angle)) * 30);
        return new Projectile(angle, 10, ammunition, player, aimPoint, 0);
    }
    return null;
}
这是JUnitTest:

    @Test
public void testShoot_posY_posX_posAngle() {
    System.out.println("shoot");

    Point initialPosition = new Point(10, 10);
    int angle = 10;
    Player player = new Player("testPlayer", "");
    HandGun instance = new HandGun("testHandGun", 0, new CircleCharacter("testCharacter", 0, 0, initialPosition));
    Projectile expResult = new Projectile(angle, 10, instance.getAmmunition(), player, initialPosition, 0);
    Projectile result = instance.shoot(initialPosition, angle, player);
    assertEquals("projectile: " + result.toString() + " does not equal expected projectile: " + expResult.toString(), expResult, result);
}
这就是错误:

java.lang.AssertionError: projectile:  does not equal expected projectile:  expected:<ammunition.Projectile@749f698d> but was:<ammunition.Projectile@6430d554>
at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.failNotEquals(Assert.java:834)
at org.junit.Assert.assertEquals(Assert.java:118)
at weapon.HandGunTest.testShoot_posY_posX_posAngle(HandGunTest.java:60)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:86)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:49)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:64)
at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:50)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:106)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:360)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
java.lang.AssertionError:Sproject:不等于预期的Sproject:expected:但为:
位于org.junit.Assert.fail(Assert.java:88)
位于org.junit.Assert.failNotEquals(Assert.java:834)
位于org.junit.Assert.assertEquals(Assert.java:118)
在arm.HandGunTest.testShoot_posY_posX_posAngle(HandGunTest.java:60)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:497)
位于org.junit.runners.model.FrameworkMethod$1.runReflectVeCall(FrameworkMethod.java:50)
位于org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
位于org.junit.runners.model.FrameworkMethod.invokeeexplosive(FrameworkMethod.java:47)
位于org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
位于org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
位于org.junit.internal.runners.statements.runafter.evaluate(runafter.java:27)
位于org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
位于org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
位于org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
位于org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
位于org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
位于org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
访问org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
位于org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
位于org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
位于org.junit.internal.runners.statements.runafter.evaluate(runafter.java:27)
位于org.junit.runners.ParentRunner.run(ParentRunner.java:363)
位于org.gradle.api.internal.tasks.testing.junit.junitsetclassexecuter.runTestClass(junitsetclassexecuter.java:86)
位于org.gradle.api.internal.tasks.testing.junit.junitsetclassexecuter.execute(junitsetclassexecuter.java:49)
位于org.gradle.api.internal.tasks.testing.junit.junitestclassprocessor.processTestClass(junitestclassprocessor.java:64)
位于org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:50)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:497)
位于org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
位于org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
位于org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
位于org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
位于com.sun.proxy.$Proxy2.processTestClass(未知源)
位于org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:106)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:497)
位于org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
位于org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
位于org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:360)
位于org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
位于org.gradle.internal.concurrent.stoppableexecutompl$1.run(stoppableexecutompl.java:40)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
运行(Thread.java:745)
除assertEquals外,整个测试均有效。
一旦尝试执行assertEquals,它就会抛出异常。

重写类的toString方法。改变你的身份

 assertEquals("projectile: " + result.toString() + " does not equal expected projectile: " + expResult.toString(), expResult.toString(), result.toString());

现在您正在测试实例是否相等

是否覆盖了
抛射体的
方法的
hashcode()
equals()
toString()


但是,
断言错误
是因为
expResult
result
相等

有几件事需要纠正-

  • 正如其他答案所指出的,您应该重写投射类中的hashCode()和equals()方法
  • 在单元测试中,应该将对象传递给assertEquals(),而不是使用toString()进行比较
  • 重写toString()仅使对象可读