相关文章推荐
含蓄的铁板烧  ·  How To Fix ...·  3 月前    · 
重情义的卤蛋  ·  2024李梦娇常识公基历年真题精讲100题全 ...·  1 年前    · 
傲视众生的麻辣香锅  ·  Java – Spring Testing ...·  2 年前    · 
忧郁的麻辣香锅  ·  苏联绝密档案曝光,美国投掷原子弹,其实救了日 ...·  2 年前    · 
卖萌的登山鞋  ·  Python使用redis存储对象_pyth ...·  2 年前    · 
Code  ›  为什么Junit不能在测试中执行依赖注入?开发者社区
https://cloud.tencent.com/developer/ask/sof/107409526
机灵的西瓜
1 年前
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
提问

问 为什么Junit不能在测试中执行依赖注入?

Stack Overflow用户
提问于 2022-10-31 14:24:36
EN

我有Junit5和Lombok的原始Spring项目。我有一个简单的课程:

代码语言: javascript
复制
public class Calculator {
    public int subtract(int a, int b) {
        return a - b;
}

并为其创建了测试:

代码语言: javascript
复制
import lombok.AllArgsConstructor;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
@AllArgsConstructor
class CalculatorTest {
    private final Calculator calculator;
    private static final int SUBTRACTION_RESULT = 2;
    @Test
    void subtractTest() {
        int result = calculator.subtract(5, 3);
        assertEquals(result, SUBTRACTION_RESULT);
}

测试失败:

代码语言: javascript
复制
org.junit.jupiter.api.extension.ParameterResolutionException: No ParameterResolver registered for parameter [final com.udemy.junits.Calculator calculator] in constructor [public com.udemy.junits.CalculatorTest(com.udemy.junits.Calculator)].

据我所知,它无法初始化和实例化计算器。在没有Lombok的情况下,我尝试这样做,并添加了构造函数:

代码语言: javascript
复制
public CalculatorTest(Calculator calculator) {
    this.calculator = calculator;
}

结果是一样的。然后,我使用@BeforeAll以这种方式实例化了这个示例:

代码语言: javascript
复制
@BeforeAll
    static void init() {
        calculator = new Calculator();
    }

这个成功了。这里没有依赖注入,因为我们没有应用程序上下文吗?还是我搞错了?如果不将计算器var实例化为 new Calculator() ,就可以在这里执行依赖注入吗?

1 47 0 票数 1
EN
spring-boot
junit5
java

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-31 14:37:23

最后的代码块是正确的,是标准实践,您不需要在这个测试类中为 Calculator 实例构造函数。

对于测试类,应该定义字段并在 @BeforeAll 或 @BeforeEach 方法中初始化它们。

在JUnit中为测试类使用构造函数是为参数化单元测试保留的,这就是为什么您要得到一个错误,说明您缺少了一个 ParameterResolver 。这将是一个示例,您将使用构造函数进行参数化测试:

代码语言: javascript
复制
public class Calculator {
    public int subtract(int a, int b) {
        return a - b;
@RequiredArgsConstructor
@RunWith(Parameterized.class)
class CalculatorTest {
    private final int x;
    private final int y;
    private final int z;
    private Calculator calculator;
    // Constructor is generated by lombok with @RequiredArgsConstructor
    // and accepts three parameters, x, y, and z
    @BeforeEach
    void setUp() {
        calculator = new Calculator();
    @Test
    void testSubtract() {
        assertEquals(z, calculator.subtract(x, y));
     * This method will pass each parameter into the constructor
     * of this test class. In this case, the testSubtract method
     * will be ran 4 times with each set of parameters.
    @Parameterized.Parameters
    static Collection parameters() {
        return Arrays.asList(
            new Object[][] {
               {5, 3, 2},
               {10, 1, 9},
 
推荐文章
含蓄的铁板烧  ·  How To Fix “CannotResolveClassException” | Loadium
3 月前
重情义的卤蛋  ·  2024李梦娇常识公基历年真题精讲100题全程班百度云网盘
1 年前
傲视众生的麻辣香锅  ·  Java – Spring Testing – java.lang.IllegalArgumentException: Not enough variable values available to expand – iTecNote
2 年前
忧郁的麻辣香锅  ·  苏联绝密档案曝光,美国投掷原子弹,其实救了日本一命|二战|美军|先进武器_网易订阅
2 年前
卖萌的登山鞋  ·  Python使用redis存储对象_python redis set保存数组_Y.zh的博客-CSDN博客
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号