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);
    }
}
 
 
 
posted @ 2025-04-08 14:54  ppjj  阅读(48)  评论(0)    收藏  举报