【问题标题】:How to perform @mock in abstract class (not Inject Mock)如何在抽象类中执行@mock(不是 Inject Mock)
【发布时间】:2021-10-28 15:38:48
【问题描述】:

当我尝试 MOC 依赖类(实例变量)时,它不会被抽象类嘲笑。但它适用于所有其他类。任何想法如何解决这个问题。我知道,我可以从子类中覆盖这段代码。但我想知道是否可以通过抽象类进行覆盖。另外,我想使用 Mockito 来解决它。 目前,我在下一行得到一个 NULL 点异常,因为 mamApiDao 是 null 并且没有被嘲笑

OvpStatusResponse ovpStatusResponse = mamApiDao.updateOvpMetadataInMam(null, callbackMessage.getMediaId(), ovpStatus, publishMessage);

抽象类

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.qvc.qq.mamapimodel.model.mamapi.OvpStatus;
import com.qvc.qq.mamapimodel.model.mamapi.response.OvpStatusResponse;
import com.qvc.qq.mammessageprocessor.config.settings.MqMessageSettings;
import com.qvc.qq.mammessageprocessor.dao.MamApiDao;
import com.qvc.qq.mammessageprocessor.manager.ErrorMessageManager;
import com.qvc.qq.mammessageprocessor.model.CdnCallbackMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.server.ResponseStatusException;
    
        public abstract class CallbackManager {
        
            private final MamApiDao mamApiDao;
        
            public CallbackManager( MamApiDao mamApiDao) {
                this.mamApiDao = mamApiDao;
            }
           
        
            public void processCallback(CdnCallbackMessage callbackMessage, int retries, OvpStatus ovpStatus, String publishMessage) {
                // some code 
                
                //mamApiDao is NULL, it is not getting mocked
               OvpStatusResponse ovpStatusResponse = mamApiDao.updateOvpMetadataInMam(null, callbackMessage.getMediaId(), ovpStatus, publishMessage);
                
                // some code 
        
            }
            
        }

测试类

import com.qvc.qq.mamapimodel.model.mamapi.OvpStatus;
import com.qvc.qq.mamapimodel.model.mamapi.response.OvpStatusResponse;
import com.qvc.qq.mammessageprocessor.config.settings.MqMessageSettings;
import com.qvc.qq.mammessageprocessor.dao.MamApiDao;
import com.qvc.qq.mammessageprocessor.dao.MqMessagingDao;
import com.qvc.qq.mammessageprocessor.model.CdnCallbackMessage;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.isNull;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class CallbackManagerTest {

    @InjectMocks
    CallbackManager callbackManager = Mockito.mock(CallbackManager.class, Mockito.CALLS_REAL_METHODS);

    @Mock
    MamApiDao mamApiDao;
    
    @BeforeEach
    void setUp() {
        MockitoAnnotations.openMocks(this);
      
    }
    
     @Test
    public void processCallbackTest() {
        when(mamApiDao.updateOvpMetadataInMam(any(), anyString(), any(), anyString())).thenReturn(new OvpStatusResponse());
        callbackManager.processCallback(cdnCallbackMessage, 1, OvpStatus.ACTIVE, "published");
        verify(mamApiDao, times(1)).updateOvpMetadataInMam(any(), anyString(), any(), anyString());

    }
}

枚举类

public enum OvpStatus {
    SUBMITTED("SUBMITTED"),
    ACTIVE("ACTIVE"),
    INACTIVE("INACTIVE"),
    ERROR("ERROR"),
    NONE("NONE");

    private String value;

    private OvpStatus(String value) {
        this.value = value;
    }

    public String getValue() {
        return this.value;
    }
}

道类

import com.qvc.qq.mamapimodel.model.mamapi.OvpStatus;

    import com.qvc.qq.mamapimodel.model.mamapi.response.OvpStatusResponse;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Component;
    
    @Slf4j
    @Component
    public class MamApiDao {
          
    
        public OvpStatusResponse updateOvpMetadataInMam(String mamId, String ovpId, OvpStatus status, String publishMessage) {
    
    
            OvpStatusResponse ovpStatusResponse = new OvpStatusResponse();
            ovpStatusResponse.setId(1);
            ovpStatusResponse.setStatus("");
            return ovpStatusResponse;
        }
    }

测试依赖

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-test</artifactId>
    <scope>test</scope>
</dependency>

【问题讨论】:

  • 看起来 @InjectMocks 未处理,因为您有字段初始化程序。我很确定不支持您想要的。你不应该测试模拟类。
  • 不应该 @Mock 注释假设工作。这样下面的代码就会返回一个对象。我的意思是它确实适用于所有其他类,或者它是抽象类特有的东西。目前,我在下一行得到一个 NULL 点异常,因为 mamApiDao 为空并且没有被嘲笑 when(mamApiDao.updateOvpMetadataInMam(any(), anyString(), any(), anyString())).thenReturn(new OvpStatusResponse ());
  • 我无法重现问题。你能提供最小的、可重现的例子吗?
  • 是的,我会整理一些东西。感谢您的尝试
  • @talex 刚刚在原始问题中添加了更多代码sn-ps

标签: java spring-boot mockito junit5


【解决方案1】:

你能像下面这样试试吗?

public class CallbackManagerTest {

@InjectMocks
CallbackManager callbackManager = Mockito.mock(CallbackManager.class, Mockito.CALLS_REAL_METHODS);

@MockBean
private MamApiDao mamApiDao;

@BeforeEach
void setUp() {
    MockitoAnnotations.openMocks(this);
  
}

//do something

【讨论】:

  • 是的,试过了。但是当我的代码到达以下行时发生了空异常。 MaapiDao 为空。当(mamApiDao.updateOvpMetadataInMam(any()
  • 您是否通过从 CallbackManager 类手动运行来测试您的 mmApiDao?
  • 是的。功能测试已经完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 2020-04-04
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 2021-12-14
  • 1970-01-01
相关资源
最近更新 更多