There’s this weird problem.
I’m currently testing two repository classes that I plan to use as MockBean.
The snippets of the code are as follows:
For ClassARepoHibernate
@Repository public class ClassARepoHibernate implements ClassARepo { @Autowired JdbcTemplate jdbcTemplate; ....
For ClassBRepoHibernate
@Repository public class ClassBRepoHibernate implements ClassBRepo { @Autowired JdbcTemplate jdbcTemplate; ....
Now then, on the testing class, I put this up:
@SpringBootTest public class unitTest{ @MockBean ClassARepo repoA; @MockBean ClassBRepo repoB; @Test public void testing(){ System.out.println("Start");//I put breakpoint here when (repoA.function(any())).thenReturn(null); when (repoB.function(any())).thenReturn(null); System.out.println("End"); } }
When I run this test, it gives out this error before even going to the breakpoint if I debug:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'ClassBRepoHibernate' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
This confuses me because generally, both classes are similar in structure. But somehow, my project recognizes ClassARepo while not recognizing ClassBRepo. Like, if I just comment out everything about ClassBRepo, then the test works out.
Additionally, if I use an actual run on the application instead of testing, ClassBRepo works fine.
What goes wrong here? Here’s my pom.xml for good measure.
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.6</version><!-- lookup parent from repository --> </parent> <groupId>id.co.test</groupId> <artifactId>test/artifactId> <version>0.0.1-SNAPSHOT</version> <name>test</name> <description>Test Project</description> <packaging>jar</packaging> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.json</groupId> <artifactId>json</artifactId> </exclusion> <exclusion> <groupId>com.vaadin.external.google</groupId> <artifactId>android-json</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>19.8.0.0</version> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20190722</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <scope>test</scope> <type>jar</type> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.13.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.13.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.13.3</version> </dependency> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <finalName>test</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> <packagingExcludes>**/*.properties</packagingExcludes> </configuration> </plugin> </plugins> </build> </project>
I’ve tried adding @Service and @Component on ClassBRepo. I studied the structure of both classes and found out that they are the same (same package, especially), hoping that it’ll get past the NoSuchBeanDefinitionException part.
I also tried putting this line in application-test.properties:
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
I still end up with the same result.
Thanks in advance for the help.
Advertisement
Answer
You have a @MockBean
for ClassBRepo
but the error message is a NoSuchBeanDefinitionException
for ClassBRepoHibernate
.
I’m guessing somewhere in your code you are referencing the concrete class. Eg:
public class SomeOtherClass { @Autowired ClassBRepoHibernate repoB; ... }
This will need to change to the interface. Eg:
public class SomeOtherClass { @Autowired ClassBRepo repoB; ... }