首先,请原谅我用了一个很土,很有争议的标题。小弟才思枯竭,实在想不出来什么文雅的了,抱歉~~
前言
换了东家后,从一个死忠C# Fans摇身一变,客串了一把Java程序员,可能是受老赵的《Why Java Sucks》系列博文影响太大,刚开始那几天有很大的抵触情绪,后来想想,何不乘此机会深入了解一下Java。
静态导入
优点
前言就说到这儿,现在进入今儿这篇文章的正题:静态导入(static import)。
先看下面这段示例代码:
1: public class SayHelloTest{
2: @Test
3: public void should_say_hello_when_given_your_name(){
4: gotoPage("hello");
5:
6: input("name","yuyijq");
7:
8: click("sayButton");
9:
10: assertThat(helloPage.getLabel(),is("hello yuyijq"));
11: }
12: }
1: import static com.cnblogs.yuyijq.functionalTest.gotoPage;
弊端
1: map.get(MOST_VIEWED.toString());
2: map.get(LAST_VIEWED.toString());
3: map.get(IS_LAST_ARTICLE.toString());
4: map.get(IS_SHOW_PICTURE.toString());
5: //....下面有类似代码若干行
咋一看还以为这些MOST_VIEWED什么的全部是常量,但最后发现这些都是枚举PortalOptions里的项,都是通过静态导入导进来的。但由于没了PortalOptions这个具有说明信息的枚举名作为前缀,丢失了很多信息,造成这段代码不是很容易看懂,不知道map.get出来的到底是什么。代码虽然短了很多,但是如果加上PortalOptions,那么就能很直观的直到我们需要从这个map里获得PortalOptions相关的东东。
在C#里画瓢
1: public static class UnitTestExtensions
2: {
3: public static T mock<T>(this object o,Type mockType)
4: {
5: return (T)NMock.Mock(mockType);
6: }
11:
12:
13: }
由于我们是给object类扩展的方法,所以在所有的类中都可以像是自己的方法一样使用,也就可以写下下面这样的代码了:
1: public class SayHelloControllerTest
3: [Test]
4: public void should_load_user_when_given_username()
5: {
6: User user = new UserBuilder()
7: .withUserName("yuyijq")
8: .withAge(80)
9: .withSex(male)
10: .build();
11: UserDAO userDAO = mock(typeof(UserDAO));
12: when(userDAO.findByUserName("yuyijq")).thenReturn(user);
13: replay(userDAO);
14: SayHelloController controller = new SayHelloController(userDAO);
15: verify(userDAO);
16: ModelAndView mv = controller.show("yuyijq");
17:
18: assertModelAttribute(mv,"user",user);
19: }
20: }
不过给object添加扩展方法实在不是一个好主意,污染太大了。目前也没有想出更好的办法,所以就此作罢~~
后语
静态导入就记叙到这里,两个月以来我还是对Java的语法嗤之以鼻,不过对Java社区对开源的采纳程度却是由衷的感叹。
附加说明
我在这里没有任何意思表明Java好于C#,只是我在使用Java过程中发现的一些挺好的地方。这些地方能让我写出我自己觉得更好的代码,而且在我心里C#远超过Java的
地方多得多,这是毋庸置疑的。
本文出自seven的测试人生公众号最新内容请见作者的GitHub页:http://qaseven.github.io/