当前位置: 首页 > 知识库问答 >
问题:

如何模拟对象为@自动在jUnit 5单元测试?

嵇永望
2023-03-14

我正在使用jUnit 5为我的Spring引导服务类做单元测试。在服务类中,我是自动装配对象,用于调用其他类中的方法。在测试用例中,@Mock没有为@Autow的类创建对象。在这里,我给出了我的代码。

我的服务级别:

@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
    }
    }

我的组件类 :

@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;
    }
    }

我的单元测试类:

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 文件 :

<?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(name)中获得空指针异常;

共有3个答案

孔弘盛
2023-03-14

在测试类中为您的Service类使用@InjectMocks,您的Service类中的所有其他@Autow的应该是@Mock在测试类中

沈栋
2023-03-14

我在上课开始时加了@SpringBootTest。它成功了。确保您的导入对于 junit 5 是正确的。这是我的代码

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);
    }   
}
葛嘉悦
2023-03-14

您必须为测试注册MocktioExtension,例如:

@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);
    }

}

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

 类似资料:
  • 遇到了另一个常见的问题,同时为Spring Batch编写单元测试和集成测试组件是如何模拟域对象。一个很好的例子是StepExecutionListener,如下所示: public class NoWorkFoundStepExecutionListener extends StepExecutionListenerSupport { public ExitStatus afterSte

  • 我有一个示例方法(我需要编写测试用例)如下所示, 我想模拟getConfig方法并返回一个特定的字符串值。getConfig是Kotlin对象中方法,如下所示, 下面是我尝试的测试 我没有得到任何错误,但是getConfig方法没有被嘲笑。执行实际的实现。我也试过使用Powermockito。请帮帮我

  • 问题内容: 我有一个建立在一个数据库连接的烧瓶中的应用程序,非常类似于此: 现在:我正在编写一些单元测试,但我不希望它们影响数据库。我想替换为可以设置期望值的模拟对象。 我的测试中使用,足以证明烧瓶文档中的位置。测试示例看起来像 这些测试可以通过,但是可以访问数据库,正如我所说,我想用模拟对象代替db访问。我看不到任何访问g对象或更改的方法。 问题答案: 这有效 test_app.py test.

  • 问题内容: 我刚开始使用Node,现在正在编写一些单元测试。对于前几个函数,我可以正常运行,但是现在我碰到了一个包含其中的函数。我的函数的简化版本如下所示: 我尝试使用基本节点断言测试库进行测试: 由于执行此操作的时间(以及结果)总是不同的,因此它将始终失败。 在Python中,我可以设置模拟类和对象。有没有一种方法可以在Node中解决此问题而无需将moment.utc()作为函数的参数? 问题答

  • 问题内容: 我知道关于模拟和测试有很多问题,但是我发现没有任何问题可以完美地帮助我,因此我仍然对理解以下内容有疑问: 如果我弄错了,请纠正我,但据我所知,单元测试用于隔离测试一个特定类的业务逻辑,并且如果有外部需要的任何对象,它们将被模拟。因此,例如,如果我有一个简单城市居民的管理系统,该系统将居民添加到列表中并按姓名返回居民(假设:居民仅包含一些基本个人信息),如下所示: 如果现在我要进行单元测