首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在junit 5单元测试中模拟@Autowired对象?

如何在junit 5单元测试中模拟@Autowired对象?
EN

Stack Overflow用户
提问于 2020-03-19 07:11:47
回答 3查看 10K关注 0票数 1

我正在使用junit 5对我的spring引导服务类进行单元测试。在服务类中,我是用于在其他类中调用方法的自动对象。在测试用例中,@Mock并不是为@Autowired类创建对象。这是我的密码。

我的服务班:

代码语言:javascript
运行
复制
@Service
public class BarcodeReaderService {

    @Autowired
    ImageProcessor imageProcessor;

    public String dummy(String name) {
        System.out.println("function call"); //print success
        return imageProcessor.dummy(name);   //Null pointer Exception
    }
    }

我的组件类:

代码语言:javascript
运行
复制
@Component
public class ImageProcessor {

    public String dummy(String name) {
        // TODO Auto-generated method stub
        System.out.println("function call ImageProcessor"); //Not coming to this line
        return name;
    }
    }

我的单元测试课:

代码语言:javascript
运行
复制
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import com.inslab.reader.barcodereader.imageprocessing.ImageProcessor;
import com.inslab.reader.barcodereader.service.BarcodeReaderService;

@ExtendWith(MockitoExtension.class)
public class BarcodeReaderServiceTest {

    @InjectMocks
    BarcodeReaderService barcodeReaderService;

    @Mock
    ImageProcessor imageProcessor;


    @Test
    void testDummy() {
        Mockito.when(imageProcessor.dummy("name")).thenReturn("name");
        String name = barcodeReaderService.dummy("name");
        Assertions.assertEquals("name", name);
    }

}

pom.xml文件:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.inslab.reader</groupId>
    <artifactId>barcodereader</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>barcodereader</name>
    <packaging>jar</packaging>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.vaadin.external.google</groupId>
                    <artifactId>android-json</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

在运行这个测试时,我得到了imageProcessor.dummy(名称)中的空指针异常;

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-03-21 17:51:42

我在上课一开始就添加了@SpringBootTest。啊,真灵。确保您的导入对junit 5是正确的。这里是我的代码,

代码语言:javascript
运行
复制
package com.inslab.reader;

import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.mock.web.MockMultipartFile;
import com.google.zxing.Result;
import com.inslab.reader.ImageProcessor;
import com.inslab.reader.IReader;

@SpringBootTest
class BarcodeReaderServiceTest {

    @InjectMocks
    BarcodeReaderService barcodeReaderService;

    @Mock
    ImageProcessor imageProcessor;

    @BeforeEach //instead of @Before have to use @BeforeEach in junit5
    public void setup() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    void testDummy() {
        Mockito.when(imageProcessor.dummy("name")).thenReturn("name");
        String name = barcodeReaderService.dummy("name");
        Assertions.assertEquals("name", name);
    }   
}
票数 1
EN

Stack Overflow用户

发布于 2020-03-19 07:27:13

您必须为测试注册MocktioExtension,如下所示:

代码语言:javascript
运行
复制
@ExtendWith(MockitoExtension.class)
public class BarcodeReaderServiceTest {

    @InjectMocks
    BarcodeReaderService barcodeReaderService;

    @Mock
    ImageProcessor imageProcessor;

    @Test
    void testDummy() {
        when(imageProcessor.dummy("name")).thenReturn("YOUR_OUTCOME");
        String name = barcodeReaderService.dummy("name");
        Assertions.assertEquals("YOUR_OUTCOME", name);
    }

}

此外,不要在测试中使用new来创建被测试类的实例,而是使用字段变量barcodeReaderService。当您使用Mockito时,您还必须指定Mock的行为,否则它将始终返回null

票数 3
EN

Stack Overflow用户

发布于 2021-09-30 07:52:49

在测试类中使用@InjectMocks作为您的服务类,您的服务类中的所有其他@Autowired都应该是@Mock在测试类中

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

https://stackoverflow.com/questions/60752423

复制
相关文章

相似问题

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