Junit测试方法共享成员变量的问题

Junit测试方法共享成员变量的问题

问题

网上也有对这个问题的讨论,对非静态变量修改无法传递到其他测试方法中。但是现在我发现使用静态变量仍然存在一些问题。当变量不是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也会尝试对其内部成员进行还原。
当然,以上结论仅为猜想,未经过验证,仅作参考。

猜你喜欢

转载自blog.csdn.net/qq_37242224/article/details/86673321
今日推荐