【问题标题】:How to set a value injected by Spring in a unit test?如何在单元测试中设置 Spring 注入的值?
【发布时间】:2020-01-28 15:55:25
【问题描述】:

我正在为 Spring 管理的以下类编写单元测试:

@Component
public class MyClass {
    @Value("${urlValue}")
    private String urlPath;
    private MyUrl url = new MyUrl(urlPath);

    public class MyUrl {
        MyUrl(String url) {
            if (url == null) {
                throw new NullPointerException();
            }
        }
    }
}

我正在尝试以最简单的方式设置urlValue 以进行测试。我尝试了以下方法:

public class MyClassTest {
    private MyClass mc;

    @Before
    public void setUp() {
        mc = new MyClass();
        ReflectionTestUtils.setField(mc, "urlPath", "urlValue");
    }

    @Test
    public void test() {

    }
}

但是反射设置失败,因为它来得太晚了(new MyUrl() 之前被调用并抛出异常)。什么是设置urlPath 的最简单方法,理想情况下(我假设)不更改代码,也不使用 Spring 上下文进行测试?

【问题讨论】:

  • 你可以在@Before方法中拥有它
  • 我不太了解您的答案(也不了解它与您链接的答案有何关系)。我很抱歉不理解。我在我的问题中添加的代码 sn-p 实际上已经在 @Before 方法中,但我看不出这会如何改变任何东西。你能帮我更多吗?
  • 你能添加更多代码吗?我还要说不要在方法内部创建像这样的MyClass mc = new MyClass(); 对象。请添加更多代码
  • 我添加了我认为是我情况的完整示例。如您所见,我已经在@Before 中,但仍然得到 NullPointerException。
  • 最简单的方法是使用constructor injection而不是字段注入。然后你可以为你的测试实例化它。

标签: java spring unit-testing junit


【解决方案1】:

要对 Spring 组件进行单元测试,您需要使其成员可从外部设置。最简单的方法是使用构造函数注入。字段注入需要您运行@SpringBootTest,这会使您的单元测试速度变得不合理,因为它会创建一个 Spring 上下文。

看看这里:guide to unit test in spring boot

你可以这样做(不检查正确性):

@Component
public class MyClass {
    private String urlPath;
    private MyUrl url;

    public MyClass(@Value("${urlValue}") String urlPath) {
        this.urlPath = urlPath;
        this.url = new MyUrl(urlPath)
    }

    public class MyUrl {
        MyUrl(String url) {
            if (url == null) {
                throw new NullPointerException();
            }
        }
    }
}

【讨论】:

    【解决方案2】:

    https://github.com/exabrial/mockito-object-injection

    我们创建了一个 JUnit 扩展来解决这个确切的问题。

    它很容易使用...请参阅 README.md:

    @TestInstance(Lifecycle.PER_CLASS)
    @ExtendWith({ MockitoExtension.class, InjectMapExtension.class })
    public class MyControllerTest {
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-30
      • 2011-02-11
      • 2021-09-13
      • 2019-10-10
      相关资源
      最近更新 更多