【问题标题】:Running Spring JUnit tests without @InjectMocks在没有 @InjectMocks 的情况下运行 Spring JUnit 测试
【发布时间】:2023-04-04 01:26:01
【问题描述】:

我正在尝试使用没有 @InjectMocks 注释的 JUnit 测试来测试一个类(及其方法)。注释对我不起作用,因为我尝试测试的类具有 @InjectMocks 不会创建的类属性。

这是我的函数类的样子: (文件路径:src/main/java/com/mycompany/mypackage)

package com.mycompany.mypackage;

@Service
public class MyClass {

  @Value(“${someString}”)
  private String someString;

  public printString() {
    System.out.println(someString);
  }
}

这是我的测试类的样子: (文件路径:src/test/java/com/mycompany/mypackage)

package com.mycompany.mypackage;

@RunWith(SpringJUnit4ClassRunner.class)
public class MyClassTest {

  @InjectMocks
  MyClass myClass

  @Test
  public testPrintString() {
    myClass.printString()
  }
}

我尝试使用@Autowired 代替@InjectMocks 来完全实例化MyClass bean,但这实际上不会创建MyClass 的实例,并且每当我尝试使用'测试中的 myClass' 变量。

对于我的特定用例,使用构造方法并不是一个现实的选择。

任何帮助都会很棒!

【问题讨论】:

  • 修复你的@Service使用构造函数参数而不是字段注入,然后你可以说new MyClass(randomString)
  • 我不能使用构造函数方法

标签: java spring spring-mvc junit mockito


【解决方案1】:

尝试将其添加到您的测试类以使用反射设置值:

import org.junit.Before;
import org.springframework.test.util.ReflectionTestUtils;

@Before
public void setup()
{
    ReflectionTestUtils.setField(
            myClass,"someString", 
            "SOME_VALUE", String.class);
}

【讨论】:

    【解决方案2】:

    如果你不想做模拟测试,你应该做如下。

    // @RunWith(SpringJUnit4ClassRunner.class)
    @RunWith(SpringRunner.class)
    @SpringBootTest(classes = YourApplication.class) // YourApplication is your spring boot app main class used to import spring context
    public class MyClassTest {
    
    //    @InjectMocks
        @Autowired
        MyClass myClass;
    
        @Test
        public void testPrintString() {
            myClass.printString();
        }
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-01
      • 1970-01-01
      • 2023-01-09
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 2012-07-11
      相关资源
      最近更新 更多