Java 如何使用Mockito模拟超类中的字段?

Java 如何使用Mockito模拟超类中的字段?,java,unit-testing,mockito,Java,Unit Testing,Mockito,我有一个MyClass,它有一些字段MyService-MyService 现在,我通过扩展类来测试它。i、 e.MyClassTest扩展了MyClass 我的问题是,我如何告诉Mockito模仿myService 谢谢如果无法从外部访问此字段,您有两个选项:反射和。。。反思 例1: 使用org.mockito.internal.util.reflection.FieldSetter MyClass m = new MyClass(); FieldSetter.setField(m, m.ge

我有一个
MyClass
,它有一些字段
MyService-MyService

现在,我通过扩展类来测试它。i、 e.
MyClassTest扩展了MyClass

我的问题是,我如何告诉Mockito模仿myService


谢谢

如果无法从外部访问此字段,您有两个选项:反射和。。。反思

例1: 使用
org.mockito.internal.util.reflection.FieldSetter

MyClass m = new MyClass();
FieldSetter.setField(m, m.getClass().getDeclaredField("myService"), yourService);
例2: 标准Java的反射:

MyClass m = new MyClass();
Field f = m.getClass().getDeclaredField("myService");
f.setAccessible(true);
f.set(m, yourService);

如果无法从外部访问此字段,则有两个选项:反射和。。。反思

例1: 使用
org.mockito.internal.util.reflection.FieldSetter

MyClass m = new MyClass();
FieldSetter.setField(m, m.getClass().getDeclaredField("myService"), yourService);
例2: 标准Java的反射:

MyClass m = new MyClass();
Field f = m.getClass().getDeclaredField("myService");
f.setAccessible(true);
f.set(m, yourService);

您可以如下模拟该服务

这些是你应该有的进口货

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
这是测试

MyClass myClass = new MyClass();

// Mock the service
MyService myService = mock(MyService.class);
// Write the behavior of the mocked service.
when(myService.myMethod()).thenReturn(someOutputObjectThatShouldBeReturned)

// Set the mocked service to your class.
Whitebox.setInternalState(myClass, "myService", myService)

您可以如下模拟该服务

这些是你应该有的进口货

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
这是测试

MyClass myClass = new MyClass();

// Mock the service
MyService myService = mock(MyService.class);
// Write the behavior of the mocked service.
when(myService.myMethod()).thenReturn(someOutputObjectThatShouldBeReturned)

// Set the mocked service to your class.
Whitebox.setInternalState(myClass, "myService", myService)

为什么要测试一个扩展它的类?无论如何,我看到的唯一方法是用super将依赖项(模拟服务)传递给基类的构造函数。如何初始化此字段?你能用setter赋值吗?@PavelSmirnov,基本上是
@Autowired
。我可以添加setter或更合适的另一个ctor()@burm87,我这样做是因为大多数方法都是私有的。有人可能会说这是一个糟糕的设计。我同意你说的自动连线。这是弹簧的还是弹簧靴的?您可以使用
@MockBean
向Spring上下文提供模拟,并使用
@RunWith(SpringRunner.class)
@SpringBootTest
运行测试。或者您可以通过ctor而不是直接在字段上进行自动连接。为什么要测试扩展它的类?无论如何,我看到的唯一方法是用super将依赖项(模拟服务)传递给基类的构造函数。如何初始化此字段?你能用setter赋值吗?@PavelSmirnov,基本上是
@Autowired
。我可以添加setter或更合适的另一个ctor()@burm87,我这样做是因为大多数方法都是私有的。有人可能会说这是一个糟糕的设计。我同意你说的自动连线。这是弹簧的还是弹簧靴的?您可以使用
@MockBean
向Spring上下文提供模拟,并使用
@RunWith(SpringRunner.class)
@SpringBootTest
运行测试。或者,您可以通过ctor而不是直接在现场进行自动布线。