当前位置: 首页 > 知识库问答 >
问题:

Intellij中的嘲笑不会忽略被嘲笑类中的编译错误?

江飞白
2023-03-14

我目前正在做一个小项目,作为Java测试课程的实习,我们试图看看mocking是如何工作的。

我们的目标是看到我们可以忽略我们所嘲笑的类中的错误。

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


}
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之后,exercice的目标是表明嘲笑这个类可以让我们忽略这个错误。我的一些同事使用Eclipse时,使用“以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。

共有1个答案

束高雅
2023-03-14

Mocking不应该忽略编译错误,它所做的是改变运行时的行为。

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

问题是,eclipse编译器试图实际上“半编译”一个类,这样定义就准备好了,但它在调用未编译的代码时失败了(请参见此处),所以这应该解释了为什么在eclipse中这样做是有效的,但它不是模仿系统的特性,而是eclipse编译器的特性/bug。

至于切换到eclipse,我建议不要为此切换到eclipse,因为依赖这样的特性似乎很危险,而且您不应该尝试运行未编译的类(请参阅此处的更多内容)。

 类似资料:
  • 运行jUnit时的异常 我想测试这个类,下面是测试方法 运行junit会产生以下异常

  • 我提到了这个答案,我该如何模拟java。时间本地日期。now()关于如何模拟我的LocalDateTime。now()调用。我基本上遵循了所有步骤,但只使用了LocalDateTime而不是LocalDate。 我的代码的功能是这样的,它应该只在一小时的第15或45分钟运行。因此,我将LOCAL\u DATE\u TIME静态变量设置为: 然后在我的@Before测试方法中,我有以下内容: 这是2

  • 问题内容: 我在带有打字稿的React Router v5.1.2中使用UseHistory挂钩吗?运行单元测试时,我遇到了问题。 TypeError:无法读取未定义的属性“ history”。 我也尝试使用,但仍然无法正常工作。 问题答案: 浅化使用的反应功能组件时,我需要相同的内容。 在我的测试文件中解决了以下模拟问题:

  • 当我试图模仿javax.ws.rs.core 时,我得到一条错误消息: 无法创建JAX-RS运行时委托 为什么会发生这种情况? 但是,当我试图嘲笑HttpServlet响应时,这是没有问题的!

  • 我试图在中模拟axios和。到目前为止,这是我的代码: 据我所知,这和文件里的一模一样 确切的例子: 并且我得到了 我错过了什么?