gpt4 book ai didi

java - Spring boot @Autowired 在单元测试用例中不起作用

转载 作者:行者123 更新时间:2023-12-05 07:04:53 25 4
gpt4 key购买 nike

据我了解,如果我们使用 spring 构造型,那么我们不需要使用 new 关键字来创建实例。 Spring 为我们管理它并在运行时为我们提供 bean。

为了让 Spring 注入(inject)这些 bean,我们需要在我们希望 Spring 注入(inject)那个 bean 的地方使用 @Autowired 注释。下面我有一个非常简单的类,我在其中使用 @Component 以便 spring 管理它。这个类有一个我自己负责初始化的列表,然后是一个执行一些逻辑的小方法。

@Slf4j
@Data
@NoArgsConstructor
@AllArgsConstructor
@Component
public class Parser {

private List<String> strList = new ArrayList<>();

public void parseStrings(final String[] strs) {

Arrays.stream(strs)
.map(String::toLowerCase)
.filter(str -> str.length() > 8)
.filter(str -> str.endsWith("sam"))
.forEach(sam1 -> { strList.add(sam1); });
}

}

我还编写了一个单元测试来测试它,这就是它。

import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.beans.factory.annotation.Autowired;
import static org.junit.jupiter.api.Assertions.*;
@RunWith(MockitoJUnitRunner.class)
class ParserTest {

@Autowired
private Parser parser;

@Test
void parseStrings() {
String str[] = {"abcsamsam", "abcsyjhgfed abdul sam","abcAhgbkgdjhul samad", "abcabjhgdulsamsam", "sa"};
parser.parseStrings(str);

assertTrue(parser.getStrList().size() == 3);
assertTrue(parser.getStrList().get(0).equalsIgnoreCase("abcsamsam"));

}
}

测试失败

java.lang.NullPointerException 当它尝试调用 parseStrings 方法时,这意味着它无法在运行时注入(inject)正确的初始化 bean。

有人可以指导我缺少什么吗?在类上使用 spring 构造型时是否有必要添加构造函数(我在这里使用 lombok 注释)。

最佳答案

我没有看到创建任何模拟,所以你为什么要使用 @RunWith(MockitoJUnitRunner.class)

我也看到了建议使用 @SpringBooTest 的答案。此注解加载应用程序的整个上下文,主要用于集成测试,以便集成应用程序的不同层。这也意味着不涉及模拟。你真的需要吗? (我不这么认为,因为你在谈论单元测试)

如果您的解析器没有引用任何其他 Bean(需要被模拟),那么您就处于简单单元测试的情况下。

@RunWith(SpringRunner.class) // you can even removed it 
class ParserTest {

private Parser parser;

@Before
public void setUp() {
parser = new Parser();

}

@Test
void parseStrings() {
String str[] = {"abcsamsam", "abcsyjhgfed abdul sam","abcAhgbkgdjhul samad", "abcabjhgdulsamsam", "sa"};
parser.parseStrings(str);

assertTrue(parser.getStrList().size() == 3);
assertTrue(parser.getStrList().get(0).equalsIgnoreCase("abcsamsam"));

}

关于java - Spring boot @Autowired 在单元测试用例中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62847529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com