java - 我的 Controller 在运行时工作,但 mockkmvc 测试失败,因为依赖项甚至不在类中

标签 java spring-mvc spring-boot testing mockito

当我运行测试时,我得到一个 UserService is not able to be injected 的依赖错误。这很奇怪,因为我在 ConstantsController.java 的任何地方都没有使用 UserService。此外,UserService 使用@Service 批注正确标记。

我尝试在 Controller 测试类中使用@MockBean 注释。它给了我无法识别的错误。我什至尝试在配置中 Autowiring bean,因为日志说在配置中定义了 UserService 类型的 bean。仍然没有运气。

用户服务

package com.GMorgan.RateMyFriendv5.Service;

import com.GMorgan.RateMyFriendv5.Entitiy.Role;
import com.GMorgan.RateMyFriendv5.Entitiy.User;
import com.GMorgan.RateMyFriendv5.Repository.UserRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.List;

@Slf4j
@Service
public class UserService {
    private UserRepository repository;

    public boolean login(String username, String password) {
        List<User> userList = repository.findByUsername(username);
        boolean isSuccessful = userList.get(0).isPassword(password);
        log.info("Username: {} isSucessful: {}", username, isSuccessful);
        return isSuccessful;
    }

     public boolean signUp(String email, String username, String password) {
        if (userEmailExists(email) || userUsernameExists(username)) return false;
        User user = new User();
        user.setEmail(email);
        user.setUsername(username);
        user.setPassword(password);
        user.setRole(Role.USER);
        repository.save(user);
        log.info("User email: {} username: {}", email, username);
        return true;
     }

    public boolean userEmailExists(String email) {
         return !repository.findByEmail(email).isEmpty();
    }

    public boolean userUsernameExists(String username) {
        return !repository.findByUsername(username).isEmpty();
    }
}

常量 Controller .java

package com.GMorgan.RateMyFriendv5.Controller;

import com.GMorgan.RateMyFriendv5.Utils.Mappings;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ConstantsController {

    @Value("${controller.constant.ping.message}")
    public String pingMessage;

    @RequestMapping(Mappings.PING)
    public String ping() {
        return pingMessage;
    } 
}

常量 Controller 测试

@RunWith(SpringRunner.class)
@WebMvcTest
@AutoConfigureMockMvc
public class ConstantsControllerTest {
    @Autowired
    private MockMvc mockMvc;

    @Value("${controller.constant.ping.message}")
    public String pingMessage;

    @Test
    public void pingTest() throws Exception {
this.mockMvc.perform(get(Mappings.PING)).andDo(print()).andExpect(status().isOk())
                .andExpect(content().string(containsString(pingMessage)));
    }
}

我希望测试通过。在运行时,当我转到链接时,我看到了 ping 消息。我希望测试也能这样做。

最佳答案

您需要指定要测试的 Controller :

添加 @WebMvcTest(ConstantsController.class) 到你的注释中

关于java - 我的 Controller 在运行时工作,但 mockkmvc 测试失败,因为依赖项甚至不在类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53897456/

相关文章:

java - 什么类用于关键字 'synchronized' ?

java - Spring Boot和Spring Cloud配置客户端错误

css - 无法加载资源 : the server responded with a status of 500 () Spring mvc

java - spring boot多行import.sql application.yml配置

java - 在 'src' 为 maven-jaxb2-plugin 生成文件

java - 获取 Observable 的最新值并立即发出

java - 在数亿文本中进行正则表达式搜索的任何建议(存储在 MongoDB 中)

java - Spring Hibernate 中的@Transient 方法调用

spring-boot - 如何解决 openapi-generator-maven-plugin 使用不推荐使用的类?

java - 是否有任何通用的 API/SDK 可以将自定义标签添加到现有的 AWS 资源?