首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么Junit不能在测试中执行依赖注入?

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

Stack Overflow用户
提问于 2022-10-31 14:24:36
回答 1查看 47关注 0票数 1

我有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(),就可以在这里执行依赖注入吗?

EN

回答 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},
               {120, 40, 80},
               {1, 1, 0}
            }
        );
    }
}

您可以找到有关参数化单元测试这里用于JUnit 4和这里用于JUnit 5的其他详细信息。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74264772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档