JUnit4中静态内部测试类的嵌套测试设置

时间:2019-05-17 06:55:47

标签: java unit-testing junit mockito

我在这里了解了使用JUnit创建内部测试类以更好地进行结构测试的可能性:Test cases in inner classes with JUnit

这一切都很好,但是现在我遇到了一个我无法优雅解决的问题:我希望在所有测试中都有一些通用的测试设置,并为各个内部类提供一些额外的设置。

我的结构看起来像这样:

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;

import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

@RunWith(Enclosed.class)
public class CalculatorTest {
  private Calculator calc; // class under test

  @Mock
  private Object someMockObject;

  @Before
  public void setUp() {
    // common setup
    MockitoAnnotations.initMocks(this);
    calc = new Calculator();

    when(someMockObject.toString()).thenReturn("my happy little mock object");
  }

  public static class AddTests {
    @Before
    public void setUp() {
      // test setup specifically for this class
      when(someMockObject.toString()).thenReturn("does not compile :(");
    }

    @Test
    public void shouldAddTwoIntegers() {
      int result = calc.add(2, 5);
      assertEquals(7, result);
    }
  }
}

我的问题是,内部类必须是静态的,但是我想引用封闭类的通用设置。这样做(显然)将导致以下错误:

  

无法静态引用非静态字段someMockObject

有什么办法嵌套设置吗?还是我需要依次设置每个类(因此需要重复的代码)?

使用的Java版本:Java8
使用的库:JUnit4,Mockito2.12

1 个答案:

答案 0 :(得分:1)

从嵌套类中删除静态,使用@RunWith(NestedRunner.class)

运行

将com.nitorcreations的junit-runners添加到pom.xml。