我的微服务项目基于 spring-boot 框架,我所有的单元测试都在 spring runner 上运行。
@RunWith(SpringRunner.class)
Run Code Online (Sandbox Code Playgroud)
添加此注释,导入以下库:
import org.springframework.test.context.junit4.SpringRunner;
Run Code Online (Sandbox Code Playgroud)
如何将我的测试类设置为与 junit5 一起运行?
我最近在 SpringBoot 项目中添加了一个 ApplicationStartup 类
@Component
public class ApplicationStartup
implements ApplicationListener<ApplicationReadyEvent> { ...
Run Code Online (Sandbox Code Playgroud)
它实现了 ApplicationListener。
现在,当我运行与该类无关的旧 JUNit 测试时,testrunner 尝试运行我的 StartupListener,这在这些情况下既不必要也不合适。
我的测试初始化时如何跳过 ApplicationListener?
@RunWith(SpringRunner.class)
@SpringBootTest
public class SubmissionItemManagerTest {...
Run Code Online (Sandbox Code Playgroud) 我@PostConstruct习惯在运行测试之前进行一些初始设置,但似乎该@PostConstruct方法在每个测试上都运行,而不是在初始化测试类后才运行一次。我还看到构造函数在之前的每个测试之前被调用@PostConstruct。为什么在每个@Test方法上初始化测试类,而不是一次初始化?
我在用 spring-boot-starter-test:1.5.7.RELEASE
样本测试设置:
@RunWith(SpringRunner.class)
public class TestClass {
public TestClass() {
System.out.println("constructor");
}
@PostConstruct
public void setup() {
System.out.println("setting up");
}
@Test
public void test1() {
System.out.println("test 1");
}
@Test
public void test2() {
System.out.println("test 2");
}
}
Run Code Online (Sandbox Code Playgroud)
在输出中,“构造函数”被打印两次,而“设置”被打印两次。“测试1”和“测试2”分别打印一次。
我们正与同事争论这种方法.他们说只在集成或功能级别上使用SpringRunner.
问题是在下面的级别使用它的利弊是什么?
例如,我有简单的bean:
public class RewardDurationCalculator {
private Clock clock;
public OptionalLong calculate(DurationType durationType, List<Pass> passes) {
long now = Instant.now(clock).getEpochSecond();
switch (durationType) {
case FULL_PASS:
return getCurrentPassDuration(passes, now);
case TILL_THE_END_OF_THE_CURRENT_ACTIVE_PASS:
return getTimeInCurrentPassLeft(passes, now);
}
return OptionalLong.empty();
}
private OptionalLong getCurrentPassDuration(List<Pass> passes, long now) {
return passes.stream()
.filter(currentPass(now))
.mapToLong(Pass::getDuration)
.findFirst();
}
private OptionalLong getTimeInCurrentPassLeft(List<Pass> passes, long now) {
return passes.stream()
.filter(currentPass(now))
.mapToLong(pass -> getEndTs(pass) - now)
.findFirst();
}
private Predicate<Pass> currentPass(long now) {
return pass -> pass.getStartTs() >= now && …Run Code Online (Sandbox Code Playgroud) 控制器.java
@RestController
public class Controller {
@Autowired
private UserService userService;
@Autowired
private BookService bookService;
//Below userService implementation
@PostMapping(value = "/addNewUser", consumes = "application/json")
public void addNewUser(@RequestBody User newUser) {
userService.addNewUser(newUser);
}
@GetMapping(value = "/findUserById/{id}", produces = "application/json")
public User findUserById(@PathVariable("id") Long id) {
return userService.findUserById(id);
}
@GetMapping(value = "/findUserByName/{name}", produces = "application/json")
public User findUserByName(@PathVariable("name") String name) {
return userService.findUserByName(name);
}
Run Code Online (Sandbox Code Playgroud)
UserServiceImpl.java
@Transactional
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public void addNewUser(User newUser) { …Run Code Online (Sandbox Code Playgroud) 我有一个服务类,它使用构造函数扩展另一个服务。这个类有一个自动装配的字段和一个我想使用 Mockito 进行单元测试的方法。但是,我在为其编写一个单元时遇到了困难。
假设该服务看起来有点像这样:
@Service
public class SomeService extends Service {
@Autowired
private SomeClient someClient;
public SomeService(Product product, @Qualifier(Constants.SOME_BEAN) Details temp) {
super(product, temp);
}
@Override
public State create() {
Request request = new Request();
request.set...
request.set..
Status status = someClient.createTenant(request);
..
.. // construct a State object and return
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我正在为这个类编写一个测试,并尝试对上面的 create() 方法进行单元测试。当我的测试调用此方法时,我在模拟 someClient 时遇到问题。
测试类看起来有点像:
@RunWith(MockitoJUnitRunner.class)
public class SomeServiceTest {
private Detail temp;
private SomeFacade service;
private SomeClient someClient;
private Product product;
@Before
public void setup() { …Run Code Online (Sandbox Code Playgroud) springrunner ×6
spring-boot ×4
java ×3
junit ×2
mockito ×2
spring ×2
spring-test ×2
unit-testing ×2
junit5 ×1