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

Posted

技术标签:

【中文标题】JUnit4 中静态内部测试类的嵌套测试设置【英文标题】:Nested Test Setup for Static Inner Test Classes in JUnit4 【发布时间】:2019-05-17 06:55:47 【问题描述】:

我在这里了解到使用 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】:

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

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

【讨论】:

正如我链接的答案中提到的,这不起作用,因为内部类需要是静态的,以便测试运行器正确执行它们。除非我错过了什么? 我试过你的建议,效果很好。使用该库的一个缺点是,我在一个遗留系统中工作,该系统通过 OSGi Manifest 文件管理依赖项,而 nitocreations 库不是 OSGi 就绪的......所以我必须将 JAR 作为资源包含在内,我会喜欢避免

以上是关于JUnit4 中静态内部测试类的嵌套测试设置的主要内容,如果未能解决你的问题,请参考以下文章

静态类和内部类的区别是啥

Java 静态内部类作用?

java嵌套类和内部类详解

(转)用JUnit4进行单元测试

静态内部类

内部类(嵌套类)