Tôi có nhiệm vụ tạo triển khai cho một số lượng lớn cấu trúc dữ liệu số liệu (cụ thể là quadtree và k-d tree biến thể). Tôi đã có khoảng bốn trong số những triển khai này xuống, nhưng cách tôi hiện đang thử nghiệm là không, vì tôi thiếu một từ tốt hơn, tốt.Kiểm tra đơn vị Trạng thái nội bộ của cấu trúc dữ liệu
Tôi cần một cách sạch để kiểm tra chèn và xóa dữ liệu từ các cấu trúc cây/trie này theo cách tôi có thể kiểm tra cấu trúc bên trong của các nút (kiểm tra cha mẹ, con, đặt hàng, v.v.). Các triển khai này tuân theo các chứng minh và phân tích thời gian chạy riêng biệt, vì vậy tôi cần đảm bảo rằng không chỉ một nút được chèn chính xác (có nghĩa là có thể lấy được từ cây sau), mà còn ở vị trí rất chính xác trong cây.
"Đơn vị kiểm tra" có vẻ như một cách sai lầm để đi về việc này, tuy nhiên, như mục đích của nó, nếu tôi không nhầm, là để thử nghiệm một cấu trúc hoặc API bên ngoài hệ thống. Tôi đã nhìn thấy rất nhiều câu hỏi liên quan đến kiểm tra đơn vị hỏi "làm cách nào để tôi có quyền truy cập vào một trường riêng trong thử nghiệm đơn vị" hoặc "làm cách nào để kiểm tra giá trị trả về của phương thức không công khai" và câu trả lời thường "không" t "- và tôi đồng ý với câu trả lời này.
Và vì vậy tôi không để bất cứ ai sẵn sàng giúp đỡ với lời huyên thuyên chỉ mơ hồ, giao diện cây của tôi thực hiện như sau (dựa trên bộ sưu tập java của giao diện bản đồ):
public interface SpatialMap<K, V> extends Iterable<SpatialMap.Entry<K, V>>
{
// Query Operations
/**
* Returns the number of key-value mappings in this map. If the map contains more than
* <tt>Integer.MAX_VALUE</tt> elements, returns <tt>Integer.MAX_VALUE</tt>.
*
* @return The number of key-value mappings in this map.
*/
int size();
/**
* Returns <tt>true</tt> if this map contains no key-value mappings.
*
* @return <tt>true</tt> if this map contains no key-value mappings.
*/
boolean isEmpty();
/**
* Returns <tt>true</tt> if this map contains a mapping for the specified key.
*
* @param key
* The key whose presence in this map is to be tested.
* @return <tt>true</tt> if this map contains a mapping for the specified key.
*/
boolean containsKey(K key);
/**
* Returns the value to which the specified key is mapped, or {@code null} if this map contains
* no mapping for the key.
*
* <p>A return value of {@code null} does not <i>necessarily</i> indicate that the map contains
* no mapping for the key; it's also possible that the map explicitly maps the key to
* {@code null}. The {@link #containsKey containsKey} operation may be used to distinguish these
* two cases.
*
* @see #put(Comparable, Comparable, Object)
*
* @param key
* The key whose associated value is to be returned.
* @return The value to which the specified key is mapped, or {@code null} if this map contains
* no mapping for the key.
*/
V get(K key);
// Modification Operations
/**
* Associates the specified value with the specified key in this map. If the map previously
* contained a mapping for the key, the old value is replaced.
*
* @param key
* The key with which the specified value is to be associated.
* @param data
* The value to be associated with the specified key.
* @return The previous value associated with the key, or <tt>null</tt> if there was no mapping
* for the key. (A <tt>null</tt> return can also indicate that the map previously
* associated <tt>null</tt> with <tt>key</tt>.)
*/
V put(K key, V data);
/**
* Removes the mapping for the specified key from this map if present.
*
* @param key
* The key whose mapping is to be removed from the map.
* @return The previous value associated with the key, or <tt>null</tt> if there was no mapping
* for the key. (A <tt>null</tt> return can also indicate that the map previously
* associated <tt>null</tt> with <tt>key</tt>.)
*/
V remove(K key);
// Bulk Operations
/**
* Removes all of the mappings from this map. The map will be empty after this call returns.
*/
void clear();
}
này làm cho nó khó khăn để thử nghiệm với chỉ các phương pháp công khai, vì tôi cần dữ liệu nhất định (con trỏ/con trỏ) không có sẵn từ giao diện công cộng. Ngoài ra, trong các cấu trúc trie (PR Quadtree, PRKDTree, MX biến thể, vv) có các nút được tách ra từ dữ liệu, do đó việc tạo ra một phương thức công khai trả về một "nút" cũng sẽ được tóm tắt quá xa để có được dữ liệu chính xác.
Loại phương pháp thử nghiệm (hay kỹ thuật mà tôi có thể sử dụng với JUnit và không cảm thấy như tôi đang phá hủy ranh giới nhận thức đẹp) Tôi đang tìm kiếm?
Tình trạng nội bộ như xa như orderings nút đi không bao giờ nên thay đổi, miễn là chứng minh tính đúng đắn của tôi là thực sự chính xác;) – efritz
phải nhưng nếu tên biến thay đổi ví dụ, các bài kiểm tra có thể phá vỡ. Đây là bài kiểm tra đơn vị trắng hơn (trái với hộp đen).Đôi khi phong cách này là thích hợp, và nó có vẻ như trong trường hợp của bạn, nó là những gì bạn đang tìm kiếm. –