在Eclipse中运行我的所有测试(Eclipse 3.4'Ganymede')时,一个测试列在“Unrooted Tests”下。我正在使用Junit 3.8,这个特殊测试扩展了TestCase。我认为这个测试和其他测试之间没有任何区别。我不记得在Eclipse 3.3(Europa)中发生过这种情况。
澄清:
我们还没有转移到JUnit 4.0,所以我们没有使用注释。我也用google搜索,似乎大多数人都遇到了JUnit 4的问题,但我没有看到任何解决方案。此时测试通过本地和CruiseControl传递,所以我并不过分担心,但很好奇。
当我第一次看到这个时,它是在一个失败的测试中,只有在与其他测试一起运行时才会失败。这让我陷入了兔子洞,寻找解决我从未找到的“无根”问题的解决方案。最终我发现了另一个没有正确拆除的测试的罪魁祸首。
我同意,这似乎是一个Eclipse问题。
答案 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错误出现的两种情况。
如果您在测试前错过了注释@Test。
@Test
public void foo(){ }
如果是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
}
}
您有几个简单的解决方案:
在特定测试方法中定义变量
将其作为实例变量添加到测试类
创建一个设置方法并使用@Before
答案 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)