静态对象什么时候生成
个static对象a1
B类里有个static对象b2
他们是在应用或jvm一启动的时候,对象就生成了?
还是说在使用到这些静态对象(a1,b1)的时候才生成?
还是说第一次使用到A,B类的时候他们才生成?
如果是第一种情况的话,a1和a2的生成时间几乎是挨着的
如果是后面两种,这a1和a2的生成时间可能相差很大.
kotlin为什么没有静态变量
1. Kotlin没有静态变量2. 这是因为Kotlin设计的初衷是为了替代Java,而Java中的静态变量容易导致代码的耦合性增加,不利于代码的可维护性和可测试性。
因此,Kotlin在语言设计上没有直接支持静态变量的特性。
3. 不过,虽然Kotlin没有直接的静态变量,但可以通过伴生对象(companion object)来实现类似的功能。
伴生对象可以在类内部定义,可以访问类的私有成员,且只有一个实例,可以在其中定义常量或者函数,类似于Java中的静态成员。
这样可以在Kotlin中实现类似静态变量的效果。
Kotlin没有直接的静态变量是因为它采用了一种不同的方法来处理共享状态。在Kotlin中,可以使用伴生对象来模拟静态变量的行为。伴生对象是类的一个单例实例,可以在其中定义属性和方法,这些属性和方法可以在类的实例之间共享。
这种设计使得代码更加清晰和可读,同时避免了静态变量可能带来的一些问题,如全局状态的混乱和难以测试。因此,Kotlin选择了这种更加灵活和安全的方式来处理共享状态。
如何mock静态方法
要mock静态方法,可以使用开源的mock框架如PowerMock或Mockito。
首先,需要在测试类中导入相关的mock框架和静态方法所在的类。
然后,使用框架的静态方法模拟静态方法的行为,例如使用Mockito的`when`方法,指定当调用该静态方法时返回的值。
最后,调用被测试方法时,可以像普通方法一样调用被mock的静态方法。通过这种方式,我们可以模拟静态方法的行为,方便进行单元测试。
因为Mockito使用继承的方式实现mock的,用CGLIB生成mock对象代替真实的对象进行执行,为了mock实例的方法,你可以在subclass中覆盖它,而static方法是不能被子类覆盖的,所以Mockito不能mock静态方法。
但PowerMock可以mock静态方法,因为它直接在bytecode上工作,类似这样:
import org.powermock.api.mockito.PowerMockito;import org.powermock.core.classloader.annotations.PrepareForTest;import org.powermock.modules.testng.PowerMockTestCase;import org.testng.Assert;import org.testng.annotations.Test;@PrepareForTest(AbstractAnimal.class)public class AbstractAnimalTest extends PowerMockTestCase {@Testpublic void shouldGetMockedHello() {PowerMockito.mockStatic(AbstractAnimal.class)
;PowerMockito.when(AbstractAnimal.getHello()).thenReturn("Hello mocked animal world!")
;String greetings = AbstractAnimal.getHello()
;Assert.assertTrue(greetings.equals("Hello mocked animal world!"));}}