首先,請原諒我用了一個很土,很有争議的标題。小弟才思枯竭,實在想不出來什麼文雅的了,抱歉~~
前言
換了東家後,從一個死忠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/