Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Mockito模拟spring应用程序上下文创建的对象以实现单元测试覆盖率?_Java_Spring_Unit Testing_Mockito_Applicationcontext - Fatal编程技术网

Java 如何使用Mockito模拟spring应用程序上下文创建的对象以实现单元测试覆盖率?

Java 如何使用Mockito模拟spring应用程序上下文创建的对象以实现单元测试覆盖率?,java,spring,unit-testing,mockito,applicationcontext,Java,Spring,Unit Testing,Mockito,Applicationcontext,应用场景: TaskScheduler按常规的cron间隔触发。每个调度程序作业将创建多个可运行线程。每个线程都将执行ETL过程 public class LoadTask { private static final AuditLogService AUDIT_LOG_SERVICE = ApplicationContextUtils.getApplicationContext().getBean("auditLogService", AuditLogS

应用场景: TaskScheduler按常规的cron间隔触发。每个调度程序作业将创建多个可运行线程。每个线程都将执行ETL过程

public class LoadTask {

    private static final AuditLogService AUDIT_LOG_SERVICE = 
    ApplicationContextUtils.getApplicationContext().getBean("auditLogService", AuditLogService.class);

    public void perform(ETLDetailsDTO etlDetailsDTO) {
       // Business logic
       AUDIT_LOG_SERVICE.save(AuditLogBuilder.buildSuccessAuditLog())
   }
}
AuditLogService是一个带有服务注释的spring托管bean

@Component
public class ApplicationContextUtils implements ApplicationContextAware {

    @Getter
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext appContext) {
        applicationContext = appContext;
    }
}
LoadTask不是由spring管理的组件,因此我在ApplicationContextUtils的帮助下获得AuditLogService的bean。应用程序运行良好。在编写LoadTask的单元测试用例时,引发空指针异常

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class LoadTaskTest {

@InjectMocks
private LoadTask loadTask;

@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);
}

@Test
public void testPerform() {
    Mockito.when(ApplicationContextUtils.getApplicationContext().getBean("auditLogService", AuditLogService.class)).thenReturn(new AuditLogService());
    loadTask.perform(MockObjectHelper.getETLDetailsDTO());
}
}
我无法设置AUDIT_LOG_服务的模拟对象并成功运行测试用例。如何模拟或监视应用程序上下文,以便LoadTask不会引发任何错误

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class LoadTaskTest {

@InjectMocks
private LoadTask loadTask;
@Mock
private ApplicationContext applicationContext;
@Mock
private AuditLogService auditLogService;

@BeforeEach
public void setUp() {
    MockitoAnnotations.openMocks(this);
    new ApplicationContextUtils().setApplicationContext(applicationContext);
}

@Test
public void testPerform() {
    Mockito.when(applicationContext.getBean("auditLogService", AuditLogService.class)).thenReturn(auditLogService);
    loadTask.perform(MockObjectHelper.getETLDetailsDTO());
 }
}
添加mockito内联依赖项

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-inline</artifactId>
    <version>3.10.0</version>
    <scope>test</scope>
 </dependency>

org.mockito
莫基托内联
3.10.0
测试