1

Here I'm testing JUnit Mockito test using JUnit 5 ,when I try to test got below exception

Rerun initializationError com.xxx.BookControllerTest com.xxx.BookControllerTest org.mockito.exceptions.base.MockitoException:

No tests found in BookControllerTest Is the method annotated with @Test? Is the method public?

at org.mockito.internal.runners.RunnerFactory.create(RunnerFactory.java:82) at org.mockito.internal.runners.RunnerFactory.createStrict(RunnerFactory.java:40) at org.mockito.junit.MockitoJUnitRunner.(MockitoJUnitRunner.java:154) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104) at org.junit.vintage.engine.discovery.DefensiveAllDefaultPossibilitiesBuilder$DefensiveAnnotatedBuilder.buildRunner(DefensiveAllDefaultPossibilitiesBuilder.java:114) at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86) at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:70) at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:37) at org.junit.vintage.engine.discovery.DefensiveAllDefaultPossibilitiesBuilder.runnerForClass(DefensiveAllDefaultPossibilitiesBuilder.java:57) at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:70) at org.junit.vintage.engine.discovery.ClassSelectorResolver.resolveTestClass(ClassSelectorResolver.java:66) at org.junit.vintage.engine.discovery.ClassSelectorResolver.resolve(ClassSelectorResolver.java:57) at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.lambda$resolveUniqueId$3(EngineDiscoveryRequestResolution.java:172) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1602) at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129) at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:647) at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolve(EngineDiscoveryRequestResolution.java:185) at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolveUniqueId(EngineDiscoveryRequestResolution.java:172) at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolve(EngineDiscoveryRequestResolution.java:123) at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.access$100(EngineDiscoveryRequestResolution.java:57) at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution$DefaultContext.resolve(EngineDiscoveryRequestResolution.java:224) at org.junit.vintage.engine.discovery.MethodSelectorResolver.resolveParentAndAddFilter(MethodSelectorResolver.java:56) at org.junit.vintage.engine.discovery.MethodSelectorResolver.resolve(MethodSelectorResolver.java:47) at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.lambda$resolveUniqueId$3(EngineDiscoveryRequestResolution.java:172) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1602) at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129) at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:647) at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolve(EngineDiscoveryRequestResolution.java:185) at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolveUniqueId(EngineDiscoveryRequestResolution.java:172) at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolve(EngineDiscoveryRequestResolution.java:123) at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.resolveCompletely(EngineDiscoveryRequestResolution.java:91) at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolution.run(EngineDiscoveryRequestResolution.java:82) at org.junit.platform.engine.support.discovery.EngineDiscoveryRequestResolver.resolve(EngineDiscoveryRequestResolver.java:113) at org.junit.vintage.engine.discovery.VintageDiscoverer.discover(VintageDiscoverer.java:42) at org.junit.vintage.engine.VintageTestEngine.discover(VintageTestEngine.java:64) at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverEngineRoot(EngineDiscoveryOrchestrator.java:152) at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discoverSafely(EngineDiscoveryOrchestrator.java:134) at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discover(EngineDiscoveryOrchestrator.java:108) at org.junit.platform.launcher.core.EngineDiscoveryOrchestrator.discover(EngineDiscoveryOrchestrator.java:80) at org.junit.platform.launcher.core.DefaultLauncher.discover(DefaultLauncher.java:110) at org.junit.platform.launcher.core.DefaultLauncher.discover(DefaultLauncher.java:78) at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.discover(DefaultLauncherSession.java:81) at org.junit.platform.launcher.core.SessionPerRequestLauncher.discover(SessionPerRequestLauncher.java:46) at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.(JUnit5TestReference.java:46) at org.eclipse.jdt.internal.junit5.runner.JUnit5TestLoader.createUniqueIdTest(JUnit5TestLoader.java:113) at org.eclipse.jdt.internal.junit5.runner.JUnit5TestLoader.loadTests(JUnit5TestLoader.java:47) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:513) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:756) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:452) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210) Caused by: java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) at org.mockito.internal.runners.util.RunnerProvider.newInstance(RunnerProvider.java:29) at org.mockito.internal.runners.RunnerFactory.create(RunnerFactory.java:75) ... 66 more Caused by: org.junit.runners.model.InvalidTestClassError: Invalid test class 'com.xxx.BookControllerTest':

  1. No runnable methods at org.junit.runners.ParentRunner.validate(ParentRunner.java:525) at org.junit.runners.ParentRunner.(ParentRunner.java:92) at org.junit.runners.BlockJUnit4ClassRunner.(BlockJUnit4ClassRunner.java:74) at org.mockito.internal.runners.DefaultInternalRunner$1.(DefaultInternalRunner.java:31) at org.mockito.internal.runners.DefaultInternalRunner.(DefaultInternalRunner.java:30) ... 73 more
Entity Class

@Entity
@Table(name = "book_Record")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long bookId;

    @NonNull
    private String name;

    @NonNull
    private String summary;

    private int rating;

    public Book(Long bookId, @NonNull String name, @NonNull String summary, int rating) {
        super();
        this.bookId = bookId;
        this.name = name;
        this.summary = summary;
        this.rating = rating;
    }

    public Book() {
        super();
    }

    public Long getBookId() {
        return bookId;
    }

    public void setBookId(Long bookId) {
        this.bookId = bookId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSummary() {
        return summary;
    }

    public void setSummary(String summary) {
        this.summary = summary;
    }

    public int getRating() {
        return rating;
    }

    public void setRating(int rating) {
        this.rating = rating;
    }

}



Repository class

public interface BookRepository extends JpaRepository<Book , Long>{

}

Controller Class

package com.controller;
  
import java.util.List;
import java.util.Optional; 
import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.crossstore.ChangeSetPersister.NotFoundException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;   
import com.entity.Book;
import com.repository.BookRepository;

@RestController
@RequestMapping("/book")
public class BookController {

    @Autowired
    BookRepository bookRepository;
    
    @GetMapping
    public List<Book>getAllProductRecords()
    {
        return bookRepository.findAll();
    }
    
    @GetMapping(value="/productId")
    public Book getBookById(@PathVariable(value="bookId") Long bookId)
    {
        return bookRepository.findById(bookId).get();
    }
    
    @PostMapping
    public Book createBookRecord(@RequestBody @Valid Book bookRecord)
    {
        return bookRepository.save(bookRecord);
    }
    
    @PutMapping
    public Book updateBookRecord(@RequestBody @Valid Book bookRecord) throws NotFoundException
    {
        if(bookRecord==null || bookRecord.getBookId()==null)
        {
            throw new NotFoundException();
        }
        Optional<Book> optionalBook = bookRepository.findById(bookRecord.getBookId());
        if(!optionalBook.isPresent())
        {
            throw new NotFoundException();//"Product With ID:"+productRecord.getProductId()+ "does not exist"
        }
        
        Book existingProductRecord = optionalBook.get();
        existingProductRecord.setName(bookRecord.getName());
        existingProductRecord.setSummary(bookRecord.getSummary());
        existingProductRecord.setRating(bookRecord.getRating());
        
        return bookRepository.save(existingProductRecord);
    }
    
}

Test Class

package com.xxx;

import static org.hamcrest.CoreMatchers.is;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.junit.Before;
//import org.junit.Test;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import com.changepond.controller.BookController;
import com.changepond.entity.Book;
import com.changepond.repository.BookRepository;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;

@RunWith(MockitoJUnitRunner.class)
public class BookControllerTest {
    
private MockMvc mockmvc;
    
    ObjectMapper objectMapper = new ObjectMapper();
    ObjectWriter objectWriter = objectMapper.writer();
    
    @Mock
    private BookRepository bookRepository;
    
    @InjectMocks
    private BookController bookController;
    
    Book Record_1 = new Book(1L,"english","tense",4);
    Book Record_2 = new Book(2L,"english1","tense1",3);
    Book Record_3 = new Book(3L,"english2","tense2",2);
    
    @Before
    public void setUp()
    {
        MockitoAnnotations.initMocks(this);
        this.mockmvc=MockMvcBuilders.standaloneSetup(bookController).build();
    }
    
    @Test
    public void getAllRecords() throws Exception
    {
        List<Book> records = new ArrayList<>(Arrays.asList(Record_1,Record_2,Record_3));
        
        Mockito.when(bookRepository.findAll()).thenReturn(records);
        
        mockmvc.perform(MockMvcRequestBuilders
                .get("/book")
                .contentType(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$[2].name",is("english2")));
        //.andExpect(MockMvcResultMatchers.jsonPath("$", hasSize(3)))
    }
        

}
1217
  • 11
  • 1
  • 3
  • In your class Test, have you injected the repository like ` @Mock private BookRepository bookRepository ; ` – Quentin Genet Aug 03 '22 at 10:18
  • @QuentinGenet Above I added my test class please verify it.. – 1217 Aug 03 '22 at 10:26
  • I think after your `Mockito.when(bookRepository.findAll()).thenReturn(records);` you should call your service or repository which invoke the `findAll()` mehtod. Because Mockito.When() is there to describe the behavior and the return value when the method will be invoked. But after it you have to invoke your mocked method. – Quentin Genet Aug 03 '22 at 10:39
  • @QuentinGenet can you help me to call repository? – 1217 Aug 03 '22 at 10:45
  • Try just to put in your code `bookRepository.findAll()` after your `Mockito.when()` , to see if you have a different output error. But it will be better to create a service which call your repository. and you could inject your service in your class Test with ` @InjectMocks private BookService bookService; ` – Quentin Genet Aug 03 '22 at 10:49
  • `https://www.baeldung.com/mockito-junit-5-extension` , Also you should use `@ExtendWith(MockitoExtension.class)` instead of `@RunWith(MockitoJUnitRunner.class)` – Quentin Genet Aug 03 '22 at 11:10

0 Answers0