2010-01-26 61 views
5

我正在使用JUnit 3,并且经常需要测试是否正确创建了对象。我的想法是编写一个MyTestBase类,如下所示,然后扩展到特定情境的单元测试。JUnit扩展基类,并且正在运行该类中的测试

但是在我给出的示例中,MyTests未在MyTestBase中运行测试。

public class MyTestBase extends TestCase { 
    protected String foo; 
    public void testFooNotNull() { 
    assertNotNull(foo); 
    } 
    public void testFooValue() { 
    assertEquals("bar", foo); 
    } 
} 


public class MyTests extends MyTestBase { 
    public void setUp() { 
    this.foo = "bar"; 
    } 
    public void testSomethingElse() { 
    assertTrue(true); 
    } 
} 

我在做什么错?

更新道歉。愚蠢的错误。我的基类中的测试没有正确命名。

+0

为什么不使用junit 4? – Bozho 2010-01-26 07:41:07

+1

由于系统是用Java 1.4.2编写的 – 2010-01-26 08:54:36

+0

我已经投票结束这个问题,因为这只是错误的。它没有提出真正的问题。 – 2010-02-08 09:59:33

回答

4

你说过“MyTests不会在MyTestBase中运行测试”。我试过了,所有测试都被调用,包括MyTestBase中的测试。

+0

您是否使用JUnit 3进行尝试? – Bozho 2010-01-26 08:56:42

+0

是的,我使用JUnit 3从Eclipse中尝试了它。我将MyTests类作为JUnit测试运行,并且所有测试都成功通过。 – 2010-01-26 09:00:41

+0

不错。那么问题是无关紧要的:) – Bozho 2010-01-26 11:37:30

2

那么,你可以制作MyTestBase抽象,这样它就不会尝试在基类中运行测试。更好的解决方案是在基类中有setUp,并使其调用抽象方法(例如getFoo())来初始化稍后需要的变量。实际上,如果你有这些抽象方法,你可能会发现你甚至不需要一个设置阶段 - 你可以在需要该值的地方调用抽象方法,而不是使用实例变量。显然这取决于确切的情况,但在许多情况下,这可能会更清洁。

0

你所试图做的是不是最合适的方式来实现自己的目标:

如果您想拥有共同的功能,使一些检查

  • 在实用类定义它,在static方法
  • 在超类定义,并从每个测试方法调用它
0

我不知道你想做什么,但你通常情况下,在测试中过多的常见部分并不是一个好主意,因为当通用部分出现故障时,您将会有大量测试失败,甚至可能导致软件中只有一个小错误。

我建议您使用Factory或Builder来创建复杂对象,然后测试Factory(或Builder)以正确创建对象。