JUnit为什么/如何通过编译错误传递测试?

时间:2014-05-15 17:32:09

标签: java junit tdd

我刚刚开始学习TDD,并试图以这种方式编写一个简单的项目。

我使用Eclipse和JUnit,每次进行更改时都会在相关包中运行所有测试。

但是我很高兴在包浏览器中看到我的一个测试用例有一个大的红色十字表示编译器问题...懊恼我认为我把我的日食快捷方式混淆了和避风港&# 39;所有的测试都在进行,因为它们都已经过去了。

但是当我开始摆弄时,我意识到即使存在编译器错误,Eclipse + JUnit似乎也会运行并通过测试......

JUnit测试用例:

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;

public class ATestCase {

    private Command command;
    private Invoker invoker;

    @Before
    public void setUp() throws Exception {

        command = new Command() {
            public void methodA(){};
            //haven't implemented methodB()
        };

        invoker = new Invoker(command);

    }

    @Test
    public void test(){
        invoker.invoke();
    }
}

interface Command{
    void methodA();
    void methodB();
}

Invoker类:​​

class Invoker{

    private Command command;

    public Invoker(Command command) {
        this.command = command;
        //if I invoke methodB() I get UnresolvedCompilationError
    }

    public void invoke(){
        command.methodA();
        //only if I call methodB here
        //do I get Unresolved compilation problem
//      command.methodB();
    }
}

我在测试用例的setUp中创建的命令对象只实现了一个接口的方法。这当然会在Eclipse中导致编译错误警告。

但是,除非我在测试用例中实际调用该方法,否则测试通过。 如果我确实调用了该方法,那么测试将因未解决的编译错误而失败。

enter image description here

任何人都可以向我解释究竟发生了什么吗?

****** ****** EDIT

我不确定为什么这个副本被关闭了。

显然我应该编辑这个问题以明确区别:

  • 我应该在第一行提出重复的问题:
  

" java.lang.Error可能的原因是什么:未解决   编译问题"?

  • 我的问题的标题是我问:
  

JUnit为什么/如何通过编译错误传递测试?

如何编译不应该编译的代码由JUnit 运行而没有导致错误? 我完全理解Unresolved Compilation Error的原因,它是我代码中明显未解决的编译错误。我不明白的是 错误总是不会发生(只有在我专门调用未实现的方法时才会发生)以及测试如何通过?!

可能这些问题是相关的,但除非有一个具体的答案解释它们是如何相关的,否则我无法看到它们是如何以任何方式重复的问题...

2 个答案:

答案 0 :(得分:3)

当一个类无法实现接口方法时,Java编译器不会拒绝代码,而是为该方法发出字节码,从而引发运行时错误。这解释了为什么JUnit能够运行测试以及如果你不调用methodB,测试通过的原因 - 运行时错误不会被提升。

this page,默认情况下不会发生这种情况,但要求您拥有Java - >调试'暂停执行编译错误'设置已启用。

答案 1 :(得分:0)

我假设这是设计上的:允许测试特定的方法,而不必担心编译器在其他方面会接受的其他依赖关系是否得到解决。
即我们不应该使用JUnit来告诉我们整个项目是否可以编译。