java - 为什么我的 Spring Boot Autowiring JPA 存储库未能通过 JUnit 测试?

标签 java spring junit spring-boot

我的 JUnit 测试失败,并出现以下错误:“java.lang.IllegalArgumentException:无法在目标 [com.clearsoft.demo.UserResource@756b2d90] 上找到类型 [null] 的字段 [userRepository]”

这是测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = App.class)
@WebAppConfiguration
@IntegrationTest
public class UserResourceTest {

    @Autowired
    private UserRepository userRepository;

    private MockMvc restUserMockMvc;

    @Before
    public void setup() {
        UserResource userResource = new UserResource();
        ReflectionTestUtils.setField(userResource, "userRepository", userRepository);
        this.restUserMockMvc = MockMvcBuilders.standaloneSetup(userResource).build();
    }

    @Test
    public void testGetExistingUser() throws Exception {
        restUserMockMvc.perform(get("/user/foo")
                .accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(content().contentType("application/json"))
                .andExpect(jsonPath("$.id").value(1));
    }
}

这是 UserResource 服务:

@RestController
public class UserResource {

    @Autowired
    UserRepository repository;

    @RequestMapping(value = "/user/{email}", method = RequestMethod.GET)
    User hello(@PathVariable("email") String email) {
        return repository.findByEmailAddressAllIgnoringCase(email);
    }

}

这是存储库:

public interface UserRepository extends Repository<User, Long> {

    Page<User> findAll(Pageable pageable);

    User findByEmailAddressAllIgnoringCase(String emailAddress);

}

这是实体:

@Entity
@Table(name = "users")
public class User implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = -1680480089065575997L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;

    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 255)
    @Column(name = "email_address")
    @Pattern(regexp = "[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\."
            + "[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@"
            + "(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9]"
            + "(?:[a-z0-9-]*[a-z0-9])?", message = "{invalid.email}")
    private String emailAddress;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getEmailAddress() {
        return emailAddress;
    }

    public void setEmailAddress(String emailAddress) {
        this.emailAddress = emailAddress;
    }

}

这是应用程序类:

@SpringBootApplication
public class App implements CommandLineRunner {

    @Autowired
    UserRepository repository;

    public static void main(String[] args) {
        SpringApplication.run(App.class);
    }

    @Override
    public void run(String... strings) throws Exception {
        System.out.println("**************** RUN RUN RUN RUN");
        for (User user : repository.findAll(null)) {
            System.out.println("****************" + user.getEmailAddress());
        }
    }
}

最佳答案

异常来自这一行:

ReflectionTestUtils.setField(userResource, "userRepository", userRepository);

setField方法的第二个参数是字段名称。 UserResource 具有“repository”字段 - 而不是您尝试在测试中设置的“userRepository”。

关于java - 为什么我的 Spring Boot Autowiring JPA 存储库未能通过 JUnit 测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30986653/

相关文章:

java - Spring Boot 应用程序在 STS 中工作但无法使用 java -jar 启动

java - 没有为 Void 方法调用用于修改传递的对象的 doAnswer()

java - 一起运行时 Android JUnit 测试挂起

java - 在结果中显示 JMH StackProfiler 摘要

java - 由 : sun. security.pkcs11.wrapper.PKCS11Exception 引起:CKR_DATA_INVALID

java - AMQP 防止自动消息读取

Spring/IntelliJ 在停止时不会清除 session 数据

java - 将两个 jUnit 测试用例合并为一个

java.net.ConnectException : Connection refused: while connecting to Ldap

java - Spark Streaming 中的 Kafka 消费者