Как создать макет класса Enum с помощью Mockito 2 - PullRequest
0 голосов
/ 10 февраля 2020

Это приложение разработано с использованием Spring Boot. У меня есть класс контроллера с именем BridgeController, где я выполняю вызов POST.

@PostMapping(path = STATUS, produces = MediaType.APPLICATION_JSON)
public Response status(@RequestBody final Request request) {
    return this.bridgeService.status(request);
}

Класс обслуживания с именем BridgeService, где у него есть метод с именем status, и внутри этого метода я использовал «Status», который класс enum.

@Override
public Response status(final request request) {
    final String id = request.getId();
    final Response response = Response.build();
    final Status status = Status.fromId(mappings.getId());
    if (null == status) {
        response.setStatus(RequestStatus.FAILURE);
        response.setStatusMsg(
                "Unable to find a valid mapping for the status id : " + mappings.getStatusId());
    } else {
        response.setResponse(status.getName());
    }
    return response;
}

Это мой тестовый класс

public class BridgeControllerTest extends BaseTest {
    MockMvc mockMvc;

    @Autowired
    WebApplicationContext context;

    @InjectMocks
    BridgeController bridgeController;

    @MockBean
    request request;

    @Mock
    Status status;

    @Mock
    BridgeService bridgeService;

    ObjectMapper objmapper = new ObjectMapper();

    @Before
    public  void setUp(){
        mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void statusSuccessTest() throws JsonProcessingException, Exception{  
        Mappings mappings = Mappings.build();
        when(statusRequest.getId()).thenReturn("12345");
        when(Status.fromId(mappings.getStatusId())).thenReturn(status);
        MvcResult result=this.mockMvc.perform(post("/status")
                .content(objmapper.writeValueAsString(request))
                .contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andReturn();
        String resultContent = result.getResponse().getContentAsString();      
        AppResponse appResponse = objmapper.readValue(resultContent, Response.class);
        assertEquals("Request processed successfully", Response.getStatusMsg());
        Assert.assertTrue(Response.getStatus().getValue()=="SUCCESS");  
    }
}

Мой Enum опубликован c enum Status {

PENDING(1, "PENDING"), CONFIRMED(2, "CONFIRMED"), DECLINED(3, "DECLINED");

private final int id;

private final String name;

Status(final int id, final String name) {
    this.id = id;
    this.name = name;
}
public int getId() {
    return this.id;
}
public String getName() {
    return this.name;
}

@JsonCreator
public static Status fromId(final int id) {
    for (final Status status : Status.values()) {
        if (status.getId() == id) {
            return status;
        }
    }
    return null;
}

} Получение исключения на when(AAStatus.fromId(requestMappings.getStatusId())).thenReturn(null);

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'.
For example:
    when(mock.getArticles()).thenReturn(articles);

Also, this error might show up because:
1. you stub either of: final/private/equals()/hashCode() methods.
    Those methods *cannot* be stubbed/verified.
    Mocking methods declared on non-public parent classes is not supported.
2. inside when() you don't call method on mock but on some other object.

Может кто-нибудь помочь мне решить эту проблему?

1 Ответ

0 голосов
/ 10 февраля 2020

Проблема в том, что вы пытаетесь высмеивать методы c. Вы не сможете

Почему Mockito не имитирует методы c?

Возможно, вы захотите использовать Dependency Injection более широко. В любом случае, если вы все еще хотите следовать по этому пути, используйте Powermockito

Mocking stati c методы с Mockito

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...