gpt4 book ai didi

java - Intellij 中的模拟不会忽略模拟类中的编译错误?

转载 作者:行者123 更新时间:2023-12-01 19:28:57 24 4
gpt4 key购买 nike

我目前正在做一个小项目,作为 Java 测试类(class)的练习,我们试图了解模拟是如何工作的。

我们的目标是看到我们可以忽略我们正在模拟的类中的错误。

以下是本练习中使用的三个类:

合作者:

package fr.orsys.tp2junit.prestation;

public class Collaborateur {

public Collaborateur() {
}

public String transformString(String input){
//Methode avec des bugs
System.out.println("ok")
return "ok";
}
}

预置:

package fr.orsys.tp2junit.prestation;

public class Prestation {

private Collaborateur collaborateur;

public Prestation(Collaborateur collaborateur){
this.collaborateur = collaborateur;
}

public String performService(String input){
return collaborateur.transformString(input);
}


}

最后是我们的测试类 - TestPrestation:

package tp2junit;

import fr.orsys.tp2junit.prestation.Collaborateur;
import fr.orsys.tp2junit.prestation.Prestation;
import org.junit.*;
import static org.junit.Assert.*;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public class TestPrestation {

private Prestation prestation;
private Collaborateur collaborateur;

@Before
public void beforeEachTest(){
collaborateur = mock(Collaborateur.class);
prestation = new Prestation(collaborateur);
}

@Test
public void testPerformService(){
when(collaborateur.transformString("Input")).thenReturn("Ok");
assertEquals("Ok", prestation.performService("Input"));
}

}

正如您在 Collaborateur 中看到的,缺少一个“;”在 System.out 之后,练习的目标是表明模拟该类将使我们能够忽略该错误。我的一些使用 Eclipse 的同事通过使用“Run as JUnit”功能来完成此操作没有任何问题。

在 Intellij 中,但是我没有找到这样的选项,我尝试将“启动前”选项的配置从“构建”更改为“构建,无错误检查”,正如一些 StackOverflow 帖子所建议的那样,但我这样做时出现以下错误:

java.lang.NoClassDefFoundError: Lfr/orsys/tp2junit/prestation/Collaborateur;

at java.lang.Class.getDeclaredFields0(Native Method)
at java.lang.Class.privateGetDeclaredFields(Class.java:2583)
at java.lang.Class.getDeclaredFields(Class.java:1916)
at org.junit.runners.model.TestClass.getSortedDeclaredFields(TestClass.java:77)
at org.junit.runners.model.TestClass.scanAnnotatedMembers(TestClass.java:70)
at org.junit.runners.model.TestClass.<init>(TestClass.java:57)
at org.junit.runners.ParentRunner.createTestClass(ParentRunner.java:88)
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:83)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:65)
at org.junit.internal.builders.JUnit4Builder.runnerForClass(JUnit4Builder.java:10)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:49)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
Caused by: java.lang.ClassNotFoundException: fr.orsys.tp2junit.prestation.Collaborateur
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
... 18 more

如果有人知道如何解决这个问题,那就太棒了,否则我想我只能改用 Eclipse,这有点令人失望,因为我真的很喜欢 Intellij。

最佳答案

模拟不应忽略编译错误,模拟所做的是改变运行时中的行为。

基本编译不会“半编译”一个类,就像保留 API 但方法调用失败一样,但根本不应该生成 .class 文件,所以你不能甚至加载类。

问题是 Eclipse 编译器尝试实际“半编译”一个类,这样定义就准备好了,但在调用未编译的代码时失败(参见 here ),所以应该解释一下为什么在 Eclipse 中这可以工作,但它不是模拟系统的功能,而是 Eclipse 编译器的功能/错误。

至于切换到 eclipse,我建议不要为此切换到 eclipse,因为依赖这样的功能似乎很危险,并且您不应该尝试运行未编译的类(更多信息请参见 here )。

关于java - Intellij 中的模拟不会忽略模拟类中的编译错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60393636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com