10월, 2020의 게시물 표시

[STL] vector 의 정렬 - object pointer 정렬

이미지
[STL] vector 의 정렬 - object pointer 정렬 이 주제는 C++ STL 의 기본에 가까운 듯 한데, 평소에 C++ 로 프로젝트가 진행되는 경우가 없어서 익숙하지가 않아, 쓸때마다 헷갈려서 ( 특히 object pointer 타입을 다룰 때… ) 정리차원에서 한 번 포스팅해 좀. 1. Primitive 타입 먼저 가장 기본 형태. primitive type 의 vector 를 보자. vector<int> v; for (int i = 0; i < 20; i++) v.push_back(i); random_shuffle(v.begin(), v.end()); for (int i = 0; i < 20; i++) cout << v[i] << " "; cout << endl; sort(v.begin(), v.end()); for (int i = 0; i < 20; i++) cout << v[i] << " "; cout << endl; (실행결과) 1 11 15 0 14 7 16 13 8 10 17 5 2 19 18 9 4 3 6 12 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 위와 같이 오름차순으로 정렬이 된다. 기본적으로 std::sort 함수는 elements 비교에 ‘<’ 연산자를 사용하기 때문이다. 그럼 내림차순으로 정렬을 하려면 어떻게 해야 하는가? 바로 compare 하는 함수를 지정해 주거나, compare object 를 지정해 주는 것이다. 이때 함수는 bool comp(int a, int b) 형태로 표현하면 된다. 중요한 점은 comp 함수의 return value 가 true 라면 a 가 b 보다 앞으로 간다는 것이다. 위의 코드에

[Unit Test] Robolectric 4.4 와 Shadow 그리고 Mocking

이미지
[Unit Test] Robolectric 4.4 와 Shadow 그리고 Mocking 안드로이드 어플리케이션의 유닛 테스트를 작성하다 보면,비즈니스 로직을 완전 순수하게 자바로 독립해서 작성하기에는 너무 코드가 많아지고 복잡해지고 솔직히 너무 오버 아키텍처가 되는게 아닐까 고민하게 되는 것 같습니다. 결국 안드로이드 프레임워크 API 를 이용하게 되는데, 이 안드로이드 API 들을 mocking 하기 위해서 그래도 가볍우면서 샘플코드나 자료를 쉽게 찾을 수 있는 mocking framework인 Mockito 를 사용하게 됩니다. 그런데 또 이걸 이용해서 유닛 테스트를 만들며 mock object들을 만들다보면 내가 테스트 코드를 작성하는 건지, 안드로이드 프레임워크 코드를 작성하는 건지 하는 생각이 듭니다. 결국 안드로이드 프레임워크 코드를 내가 작성해야 하는 상황이 싫어, Robolectric을 사용하는 것을 고민하게 됩니다. Robolectric의 원래 목적을 생각해보면 실제 디바이스나 에뮬레이터 상에서 UI를 수행하는 대신, 빌드 타임에 UI테스트를 수행할 수 있게 해 줍니다. 하지만 이 글에서는 여기까지는 고려하지 않고, 직접 Mock 객체를 만들지 않아도 안드로이드 프레임워크 API를 이용할 수 있다는 것에 집중하려합니다. 그리고 Mock 객체를 직접 만들지 않고 Shadow를 사용하는 것은 부족한 점이 있지만, 이 부분을 어떻게 채워가는지 이야기 하고자 합니다. Mocking 할 필요가 없다. 먼저 JUnit으로 안드로이드 어플리케이션의 유닛 테스트를 작성하는 상황을 보겠습니다. 테스트를 작성할 때, 코드에서 안드로이드 프레임워크의 API를 이용하면 IDE 상으로는 에러를 보여주지 않지만, 실제 테스트를 수행해 보면 에러가 발생합니다. (테스트 대상 클래스) public class MyClass { public boolean verifyName(String name) { r