问题
网上也有对这个问题的讨论,对非静态变量修改无法传递到其他测试方法中。但是现在我发现使用静态变量仍然存在一些问题。当变量不是Java常规类型时,比如是个自定义类User时,对变量引用本身的修改没有问题,而对变量成员的修改无法影响到其他测试方法,见示例。
示例
如下类:
@Data
@Entity
@Table(name = "user")
public class User implements Serializable {
private static final long serialVersionUID = -6048363990215730996L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
Long id;
@Column(name = "title")
String title;
}
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserRepositoryTest {
@Autowired
private UserRepository userRepo;
private static User testUser = new User();
@Before
public void t1_setup() {
testUser .setName("Repository Test Name");
testUser = userRepo.save(testUser);
}
@Test
public void t2_update() {
testUser .setName("Repository Test Name(Updated)");
System.out.println(testUser .hashCode()); // BreakPoint 1
testUser = userRepo.save(testUser );
System.out.println(testUser .hashCode()); // BreakPoint 2
}
@Test
public void t3_findAll() {
System.out.println(testAd.hashCode()); // BreakPoint 3
}
}
以上三个断点处,testUser的变化如下:
BreakPoint 1: hashcode = 46, id = 2096, name = "Repository Test Name"
BreakPoint 2: hashcode = 61, id = 2096, name = "Repository Test Name(Updated)"
BreakPoint 3: hashcode = 61, id = 2096, name = "Repository Test Name"
可以看到t2_update
测试方法执行后,testUser引用确实变了,因为在t3_findAll
里它的hashcode也是61了。但是name却变回去了,我猜测junit有保证测试方式执行前后,测试环境不变(还原测试类非静态成员变量值等)的策略,即使testUser是个静态变量,但其内部成员是非静态的,并且有setter和getter方法,junit也会尝试对其内部成员进行还原。
当然,以上结论仅为猜想,未经过验证,仅作参考。