静态和有参

该博客内容涉及创建了两个村庄类对象,赵庄和马家河子,并设置了各自的人口数量。村庄类包含人口数量和井水数量的管理方法。在主类Land中,初始化井水数量为200,赵庄喝掉50单位井水,马家河子喝掉100单位井水,然后输出了村庄人口和剩余井水数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、村庄

村庄类Village有一个int类型的peopleNumber变量,用于描述村庄的人口数量,String类型的name用于描述村庄的名称。定义一个【有参】构造函数对村庄名称进行初始化。定义setPeopleNumber(int p)对村庄人口进行设置,定义getPeopleNumber( )对村庄人口进行获取。

在主类Land的main方法中定义两个名为赵庄,马家河子的村庄,人口分别设置为80和120.

输出两个村庄的人口数量。

2、共饮同井水

模拟两个村庄公用同一口井水。在上题的村庄类Village中,加入一个静态static的int型成员变量waterAmount,用于模拟井水的数量。定义一个静态的setWaterAmount方法设置井水数量。一个drinkWater(int d)的方法来喝井水。一个静态的lookWaterAmount的方法来查看井水的数量。

在主类Land中,用村庄类名直接设置井水数量为200,赵庄喝掉井水50,输出喝掉井水的村庄名称和剩余的水量,马家河子喝掉井水100,再次输出喝掉井水的村庄名称和剩余的水量。

package shiyan_04_2;

public class Land {
	 public static void main(String[] args) {
		 Village a,b;
		 a = new Village();
		 b = new Village();
		 a.name="赵庄";
		 b.name="马家河子";
		 a.setPeopleNumber(80);
		 b.setPeopleNumber(120);
		 Village.setWaterAmount=200;
		 System.out.println(a.name+"的人口:"+a.getPeopleNumber());
		 System.out.println(b.name+"的人口:"+b.getPeopleNumber());
		 a.drinkWater(50);
		 System.out.println(a.name+"喝掉井水50,剩余井水"+Village.setWaterAmount);
		 b.drinkWater(100);
		 System.out.println(b.name+"喝掉井水100,剩余井水"+Village.setWaterAmount);
		 
	 }
}
package shiyan_04_2;

public class Village {
	static int waterAmount;//模拟井水的数量
	static int setWaterAmount;//设置井水数量
	int peopleNumber;//描述村庄的人口数量
	String name;//村庄名字
	void setPeopleNumber(int p) {
		peopleNumber=p;
	}
	int getPeopleNumber() {
		return peopleNumber;
	}
	int drinkWater(int d) {
		setWaterAmount-=d;
		waterAmount=setWaterAmount;
		return waterAmount;
	}
	static int lookWaterAmount() {
		return setWaterAmount;
	}
}

Mock 静态方法是指在一个单元测试环境中模拟对静态方法的行为,特别是当这个静态方法接收数并且需要返回预定义的结果时。为了做到这一点,通常我们会使用像 JMockit 或 Mockito 这样的 mocking 框架来进行操作。不过值得注意的是,早期版本的 Mockito 并不支持直接 mock 静态方法,但从 Mockito 3.x 版本开始已经原生加入了这一特性。 以下是两个常用的框架如何mock静态数的方法: ### 使用 JMockit Mocking Framework JMockit 是一个非常强大且灵活的工具,它允许你轻松地mock任何或接口中的实例及静态成员函数。下面是一个简单的例子来演示怎样用 JMockit 来 mock 一个包含数的静态方法: #### 步骤说明: 1. 添加依赖(如果是 Maven 项目) ```xml <dependency> <groupId>org.jmockit</groupId> <artifactId>jmockit</artifactId> <version>{最新版}</version> <scope>test</scope> </dependency> ``` 2. 编写测试代码示例: ```java import mockit.Expectations; import org.junit.Test; // 测试 public class MyStaticMethodTest { @Test public void testMyStaticMethodWithParameters() throws Exception { final MyClass myClassInstance; // 定义final变量用于Expectation内部引用 new Expectations(){{ MyClass.staticMethod("paramValue"); result = "expectedReturnValue"; // 设置预期结果 }}; String actualResult = MyClass.myStaticMethod("paramValue"); assertEquals("expectedReturnValue", actualResult); } } class MyClass { public static String myStaticMethod(String param) { return doSomething(param); // 实际业务逻辑 } private static String doSomething(String input) { // ... some logic here ... return null; } } ``` 在这个例子中,我们创建了一个`Expectations`匿名内部,并指定了当我们调用`MyClass.staticMethod("paramValue")`的时候应该返回"expectedReturnValue". --- ### 使用 Mockito Framework (3.x 及以上) 自从 Mockito 支持mock静态方法以来,在很多场景下变得更为方便快捷了。下面是采用 Mockito 来完成同样任务的方式: #### 步骤说明: 1. 更新到最新的Mockito库版本,并添加所需的依赖项: - 如果你是Maven用户,请确保你的pom.xml中有正确的Mockito依赖配置。 2. 编写测试案例样例: ```java import static org.mockito.Mockito.*; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @ExtendWith(MockitoExtension.class) public class StaticMethodsMockitoTests { @BeforeAll static void setup() { mockStatic(MyClass.class); // 启动对于MyClass的所有静态方法的mock模式 } @AfterEach void tearDown(){ verifyNoMoreInteractions(MyClass.class); // 清理交互记录 } @Test void shouldReturnExpectedStringWhenCalled() { when(MyClass.myStaticMethod(anyString())).thenReturn("expected string value"); String response = MyClass.myStaticMethod("some argument"); assertNotNull(response); assertEquals("expected string value", response); verify(MyClass.class).myStaticMethod("some argument"); // 核实确实发生了这次调用 } } class MyClass { public static String myStaticMethod(String param) { return doSomething(param); } private static String doSomething(String input) { //... business logic ... return ""; } } ``` 在这段代码里,首先通过 `mockStatic()` 函数告诉 Mockito 我们想要 mock 整个 `MyClass` 中所有的静态方法。接着可以用 `when().thenReturn()` 设定具体某个带有数值的方法应当产生的效果;最后还可以验证这些被 stubbed 的方法是否按照预期被执行过。 --- 总结来说,不论是选用 JMockit 还是升级后的 Mockito,都可以有效地帮助我们在编写单元测试的过程中处理那些难以控制外部环境因素干扰的问题,让我们的测试更加稳定可靠。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值