相关文章推荐
苦闷的猕猴桃  ·  可致瘫痪、失明,这种疾病好发于中青年·  1 年前    · 
近视的镜子  ·  魔只爱着神!晓美焰的每一句台词都离不开她深爱 ...·  1 年前    · 
腹黑的高山  ·  竖琴是打击乐器吗? - 知乎·  2 年前    · 
强悍的毛衣  ·  新加坡华语_新加坡华语和普通话的区别_新加坡 ...·  2 年前    · 
骑白马的黑框眼镜  ·  哆啦a梦剧场版_哆啦a梦剧场版顺序_哆啦a梦 ...·  2 年前    · 
小百科  ›  为什么Junit不能在测试中执行依赖注入?开发者社区
机灵的西瓜
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},
 
推荐文章
苦闷的猕猴桃  ·  可致瘫痪、失明,这种疾病好发于中青年
1 年前
近视的镜子  ·  魔只爱着神!晓美焰的每一句台词都离不开她深爱着的小圆!
1 年前
腹黑的高山  ·  竖琴是打击乐器吗? - 知乎
2 年前
强悍的毛衣  ·  新加坡华语_新加坡华语和普通话的区别_新加坡华语普及率- 抖音
2 年前
骑白马的黑框眼镜  ·  哆啦a梦剧场版_哆啦a梦剧场版顺序_哆啦a梦剧场版2022-抖音
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
小百科 - 百科知识指南
© 2024 ~ 沪ICP备11025650号