访问/设置 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/