无根测试

时间:2008-09-23 13:12:46

标签: java eclipse junit eclipse-3.4 ganymede

在Eclipse中运行我的所有测试(Eclipse 3.4'Ganymede')时,一个测试列在“Unrooted Tests”下。我正在使用Junit 3.8,这个特殊测试扩展了TestCase。我认为这个测试和其他测试之间没有任何区别。我不记得在Eclipse 3.3(Europa)中发生过这种情况。

澄清:

我们还没有转移到JUnit 4.0,所以我们没有使用注释。我也用google搜索,似乎大多数人都遇到了JUnit 4的问题,但我没有看到任何解决方案。此时测试通过本地和CruiseControl传递,所以我并不过分担心,但很好奇。

当我第一次看到这个时,它是在一个失败的测试中,只有在与其他测试一起运行时才会失败。这让我陷入了兔子洞,寻找解决我从未找到的“无根”问题的解决方案。最终我发现了另一个没有正确拆除的测试的罪魁祸首。

我同意,这似乎是一个Eclipse问题。

23 个答案:

答案 0 :(得分:21)

最后我找到了解决方案。问题是您没有使用注释定义测试用例,但仍然是“旧方法”。只要转换为使用注释,您就可以再次运行一次测试。

以下是基本测试现在应该使用注释的示例:

import static org.junit.Assert.*; // Notice the use of "static" here
import org.junit.Before;
import org.junit.Test;

public class MyTests { // Notice we don't extent TestCases anymore

  @Before
  public void setUp() { // Note: It is not required to call this setUp()
    // ...
  }

  @Test
  public void doSomeTest() { // Note: method need not be called "testXXX"
    // ...
    assertTrue(1 == 1);
  }
}

答案 1 :(得分:16)

我也收到了“无根测试”错误消息,它神奇地消失了。我相信这是因为我使用Eclipse和Maven项目。当我向Test类添加一个新方法并给它@Test注释时,当我尝试使用“Run as Junit test”菜单选项运行该方法时,它开始收到错误消息;然而,一旦我运行了maven构建,无根测试消息就消失了,我相信这是未来问题的解决方案。

运行maven构建,因为它将刷新JUnit正在使用的类。

答案 2 :(得分:12)

如果您的类将TestCase扩展到其层次结构中的某个位置,则必须使用运行配置下拉列表中列出的JUnit 3测试运行器。使用JUnit 4 runner(默认情况下我认为)会导致出现无根测试现象。

答案 3 :(得分:6)

我收到此错误是因为我重命名了我的测试方法,然后尝试通过单击相同的运行配置在Eclipse中运行测试 - 引用现在不存在的旧方法。

答案 4 :(得分:3)

我们通过确保构建测试项目来解决问题。我们在构建路径中遇到了一个问题,它不允许编译我们的测试类。一旦我们解决了构建路径问题,就会编译测试并运行“新”方法。因此,我们可以假设“无根”测试也意味着它们不存在于已编译的二进制文件中。

答案 5 :(得分:2)

我从来没有见过这个 - 但据我在谷歌浏览几分钟时可以看出,这似乎可能是Eclipse中的一个错误而不是你的测试问题。你假设测试中没有@Test注释?你可以把测试吹走并重新创建它,如果是这样你会得到同样的错误吗?

答案 6 :(得分:1)

对我来说,这是由于项目得到了构建路径问题。我的maven依赖项配置需要更新。

答案 7 :(得分:1)

我遇到了同样的问题 java.lang.NoClassDefFoundError:org / hamcrest / SelfDescribing

你需要jar hamcrest。 同一个问题14539072:java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing

答案 8 :(得分:1)

这些是Unrooted错误出现的两种情况。

  1. 如果您在测试前错过了注释@Test。

    @Test

    public void foo(){  }

  2. 如果是Gwt项目,并且定义了两个相同对象的模拟。假设有一个类A和

    @GwtMock  私人的atest;

    @GwtMock  私人A a; 然后,这也将显示Unrooted测试错误。

答案 9 :(得分:1)

我遇到了这个问题并且放了一个" @Test "在测试方法解决之前!

像这样:

@Test public void testOne() { // ... assertTrue(1 == 1); }

答案 10 :(得分:1)

导致此问题的另一种情况是我盲目地复制/粘贴需要参数的方法。即。

import org.junit.Test;

public class MyTest {

    @Test
    public void someMethod(String param) {
          // stuff
    }

}

您有几个简单的解决方案:

  1. 在特定测试方法中定义变量

  2. 将其作为实例变量添加到测试类

  3. 创建一个设置方法并使用@Before

  4. 对其进行注释

答案 11 :(得分:0)

对我来说问题是,@BeforeClass@AfterClass方法中引发了异常。这也会导致测试被归类为无根据。

答案 12 :(得分:0)

原来我的构建路径有一些错误......一些罐子丢失了。 我重新配置了构建路径,它工作正常!

答案 13 :(得分:0)

您正在使用Hamcrest?或其他图书馆帮助您进行测试? 您没有使用

import static org.junit.Assert.*;

检查您的测试中是否使用:

import static org.hamcrest.MatcherAssert.assertThat;

或其他断言不是JUnit断言。

答案 14 :(得分:0)

我的测试方法名称为" test"

@Test 
public void test() {
 // ... assertTrue(1 == 1); 
}

我重命名了这个方法并且有效

答案 15 :(得分:0)

不要使用junit1.4在你的测试类中扩展junit.framework.TestCase,这应该可以解决问题

答案 16 :(得分:0)

我遇到了这个问题,并没有宣布测试是static

答案 17 :(得分:0)

您可以尝试的另一件事是将您的JUnit版本升级到至少4.12。

我在使用@RunWith(Parameterized.class)扩展了一个类时,遇到了这个问题。

过了一会儿,我很抱歉我不确切地知道我为此做了什么,“无根测试”#39;消息消失了,但测试仍然无法正常运行。应该从@Parameters方法接受参数的构造函数永远不会被调用;执行从@BeforeClass直接跳转到@AfterClass。

该问题的解决方法是将JUnit从其使用的4.8.1升级到最新版本(4.12)。所以也许这可以在将来帮助其他人。

答案 18 :(得分:0)

我可以通过在单个测试方法的运行配置中从TestRunner ver 4.0转换为3来解决问题。

答案 19 :(得分:0)

也许这只是对该方法目标的逻辑混淆。让我们记住:

E.g。正确的标记测试方法:

@Test
@Transactional
@Rollback(true)
public void testInsertCustomer() {  
    (...)
}

- 使用Eclipse Junit插件,您可以使用方法上的上下文菜单运行该测试方法(例如,在包浏览器扩展类和方法并选择“testInsertCustomer()”方法并从该项目选择“运行为>> JUnit测试”)。

如果您忘记了“@Test”标记,或者只是该方法不是测试,而是(私有或非私有)常用方法,可以将其用作其他测试的实用工具(例如“private fillCustomerObject()” ),那么该方法不需要“@Test”标记,只是你不能将它作为JUnit测试运行!

你可以很容易地创建一个实用工具方法,然后你忘记了该方法的真正目标,所以如果你试图将它作为测试运行,JUnit会大喊“无根测试”。

答案 20 :(得分:0)

对我来说,这个问题是由@AfterClass方法中抛出的实时异常(请参阅here作为文档)造成的:

基本上所有测试方法都成功,但是在类结束时该方法失败了。因此,所有测试似乎都很好,但是在我的Eclipse上有一个附加的“无根测试”失败了。

答案 21 :(得分:0)

我在一个Maven项目中遇到了这些错误。我用mvn clean install重建了项目。问题解决了

答案 22 :(得分:0)

它实际上告诉我,有一个带有批注的测试:@RunWith(MockitoJUnitRunner.class)