java - Mockito 和私有(private)字段/注入(inject) bean

标签 java junit mockito junit5

访问/设置 Java-EE-Bean 中用于 Mockito 测试的私有(private)字段的标准方法是什么?测试如下,但当然,如果我运行(Mockito-)测试,则 MyDao 字段为空。 MyDao 抛出 NullPointerException。

但是我不想使用反射 - 有其他方法可以做到这一点还是服务的架构不好?

要测试的类:

@Stateless
public class MyServiceImpl extends AbstractService {

@Inject
private MyDao myDao;

public MyEntity findByIdOrThrow( final long id ) throws Exception {
        if ( id > 0 ) {
            final MyEntity entity = myDao.findById( id );
            if ( entity == null ) {
                throw new Exception(  );
            } else {
                return entity;
            }
        } else {
            throw new Exception(  );
        }
    }

测试类:

public class MyServiceImplTest {
private MyServiceImpl myServiceImpl;

@BeforeEach
public void setup() {
    myServiceImpl = new ServiceServiceImpl();
}

@Test
public void findByIdOrThrow() throws Exception {
    Long id = 1L;
    when( myServiceImpl.findByIdOrThrow( id ) ).thenReturn( new MyEntity() );        
}}

更新测试类:

import static org.mockito.Mockito.when;

import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.junit.MockitoJUnitRunner;

import de.myapp.dao.MyDao;
import de.myapp.entity.MyEntity;

@RunWith( MockitoJUnitRunner.class )
public class ServiceServiceImplTest {

    @Mock
    public MyDao myDao;

    @InjectMocks
    public MyServiceImpl myServiceImpl;

    @Test
    public void findByIdOrThrow() throws Exception {
        final Long id = 1L;
        when( myServiceImpl.findByIdOrThrow( id ) ).thenReturn( new MyEntity() );
    }

}

最佳答案

我假设 MyDao 是一个接口(interface)。您必须在测试类中执行以下操作:

@Mock
private MyDao myDao;

@InjectMocks
private MyServiceImpl myServiceImpl;

并删除@BeforeEach方法。通过这种方式,您将在 te 类中注入(inject)您的 dao 的模拟。使用 Mockito.when 您将正确设置 dao-mock 来模拟您的真实 dao。不要忘记更改测试声明,如下所示:

@RunWith(MockitoJUnitRunner.class)
public class MyServiceImplTest

如果您使用 JUnit 5,测试类声明应如下所示:

@ExtendWith(MockitoExtension.class)
@RunWith(JUnitPlatform.class)

在最后一种情况下,您可能可以省略@RunWith,但我不确定。

关于java - Mockito 和私有(private)字段/注入(inject) bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53410384/

相关文章:

java - 带有客户端过滤器的 Jersey 客户端

java - 什么是对象/关系不匹配

java - 将 Observable of List 转换为 List of Observables 并在 RxJava 中合并

android - 在 android.os.Looper 中使用 LiveData 方法 getMainLooper 进行单元测试未模拟

java - 如何在junit中设置mockservletcontext的真实路径

unit-testing - Powermock 在使用 JUnit 5 时抛出 ClassNotPreparedException

java - 在 Java Swing 中从 HTML 复制 img

java - Spring:@PostConstruct 在 Maven 测试中不会被调用,但如果测试在 IDEA 中运行则工作正常

java - Mockito:验证any()参数是否相同

java - Mockito 的@After 和 verifyNoMoreInteractions