Java.lang.AssertionError : Status expected:200 but was:404 in Junit test error

Java.lang.AssertionError : Status expected:<200> but was:<404> in Junit test error … here is a solution to the problem.

Java.lang.AssertionError : Status expected:<200> but was:<404> in Junit test error

I want to create JUnit tests for the Rest api and generate the api documentation. I want to test this code :

Rest Controller

@RestController
@RequestMapping("/transactions")
public class PaymentTransactionsController {

@Autowired
private PaymentTransactionRepository transactionRepository;

@GetMapping("{id}")
    public ResponseEntity<?> get(@PathVariable String id) {
        return transactionRepository
                .findById(Integer.parseInt(id))
                .map(mapper::toDTO)
                .map(ResponseEntity::ok)
                .orElseGet(() -> notFound().build());
    }
}

Repository interface

public interface PaymentTransactionRepository extends CrudRepository<PaymentTransactions, Integer>, JpaSpecificationExecutor<PaymentTransactions> {

Optional<PaymentTransactions> findById(Integer id);
}

I tried to implement this JUnit5 test with mockito :

@ExtendWith({ RestDocumentationExtension.class, SpringExtension.class })
@SpringBootTest(classes = PaymentTransactionsController.class)
@WebAppConfiguration
public class PaymentTransactionRepositoryIntegrationTest {
    .....
    private MockMvc mockMvc;

@MockBean
    private PaymentTransactionRepository transactionRepository;

@BeforeEach
    void setUp(WebApplicationContext webApplicationContext,
              RestDocumentationContextProvider restDocumentation) {

PaymentTransactions obj = new PaymentTransactions(1);

Optional<PaymentTransactions> optional = Optional.of(obj);      

PaymentTransactionRepository processor = Mockito.mock(PaymentTransactionRepository.class);
        Mockito.when(processor.findById(Integer.parseInt("1"))).thenReturn(optional);       

this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
              .apply(documentationConfiguration(restDocumentation))
              .alwaysDo(document("{method-name}", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint())))
              .build();
    }

@Test
    public void testNotNull() {
        assertNotNull(target);
    }

@Test
    public void testFindByIdFound() {
        Optional<PaymentTransactions> res = target.findById(Integer.parseInt("1"));
        assertTrue(res.isPresent());
    }

@Test
    public void indexExample() throws Exception {
            this.mockMvc.perform(get("/transactions").param("id", "1"))
                .andExpect(status().isOk())
                .andExpect(content().contentType("application/xml; charset=UTF-8"))
                .andDo(document("index-example", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()), links(linkWithRel("crud").description("The CRUD resource")),  responseFields(subsectionWithPath("_links").description("Links to other resources")),
                    responseHeaders(headerWithName("Content-Type").description("The Content-Type of the payload, e.g. `application/hal+json`"))));
    }
}

I get the error :

java.lang.AssertionError: Status expected:<200> but was:<404>

What is the correct way to make a GET request to the above code?
Maybe I need to add a response OK when sending back a message?

Solution

Hi, in my case, I need Controller’s @MockBean and all Autowiring services; )

Related Problems and Solutions