mock抽象类中的实例方法和通过Resource注解引用的实例变量
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
public abstract class AbstractService {
@Resource
private AbstractDependency abstractDependency;
public String execute() {
return "执行操作结果: " + abstractDependency.performAction();
}
public abstract void otherAbstractMethod();
}
import org.springframework.stereotype.Component;
@Component
public class ConcreteService extends AbstractService {
@Override
public void otherAbstractMethod() {
System.out.println("具体实现的其他抽象方法");
}
}
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
public class AbstractServiceTest {
@Autowired
private ConcreteService concreteService;
@Test
public void testExecute() {
// 使用Mockito模拟AbstractDependency的实例
AbstractDependency mockDependency = Mockito.mock(AbstractDependency.class);
Mockito.when(mockDependency.performAction()).thenReturn("模拟操作结果");
// 将模拟的实例注入到concreteService中(这里是简单示例,实际中可能需要更复杂的注入逻辑)
// 假设AbstractService有相应的setter方法来设置abstractDependency
// 这里为了简单,直接反射修改(实际项目中不推荐这种方式,可使用更优雅的方式)
try {
java.lang.reflect.Field field = AbstractService.class.getDeclaredField("abstractDependency");
field.setAccessible(true);
field.set(concreteService, mockDependency);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
// 调用方法并验证结果
String result = concreteService.execute();
assertEquals("执行操作结果: 模拟操作结果", result);
}
}