我正在使用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)中获得空指针异常;
在测试类中为您的Service类使用@InjectMocks,您的Service类中的所有其他@Autow的应该是@Mock在测试类中
我在上课开始时加了@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);
}
}
您必须为测试注册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()作为函数的参数? 问题答
问题内容: 我知道关于模拟和测试有很多问题,但是我发现没有任何问题可以完美地帮助我,因此我仍然对理解以下内容有疑问: 如果我弄错了,请纠正我,但据我所知,单元测试用于隔离测试一个特定类的业务逻辑,并且如果有外部需要的任何对象,它们将被模拟。因此,例如,如果我有一个简单城市居民的管理系统,该系统将居民添加到列表中并按姓名返回居民(假设:居民仅包含一些基本个人信息),如下所示: 如果现在我要进行单元测